claude-mpm 5.4.85__py3-none-any.whl → 5.6.76__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 +1 -1
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +8 -5
- claude_mpm/agents/{CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md → CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md} +14 -6
- claude_mpm/agents/PM_INSTRUCTIONS.md +109 -706
- claude_mpm/agents/WORKFLOW.md +2 -0
- claude_mpm/agents/templates/circuit-breakers.md +26 -17
- claude_mpm/auth/__init__.py +35 -0
- claude_mpm/auth/callback_server.py +328 -0
- claude_mpm/auth/models.py +104 -0
- claude_mpm/auth/oauth_manager.py +266 -0
- claude_mpm/auth/providers/__init__.py +12 -0
- claude_mpm/auth/providers/base.py +165 -0
- claude_mpm/auth/providers/google.py +261 -0
- claude_mpm/auth/token_storage.py +252 -0
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/hook_errors.py +60 -60
- claude_mpm/cli/commands/mcp.py +29 -17
- claude_mpm/cli/commands/mcp_command_router.py +39 -0
- claude_mpm/cli/commands/mcp_service_commands.py +304 -0
- claude_mpm/cli/commands/monitor.py +2 -2
- claude_mpm/cli/commands/mpm_init/core.py +2 -2
- claude_mpm/cli/commands/oauth.py +481 -0
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +5 -3
- claude_mpm/cli/executor.py +128 -16
- claude_mpm/cli/helpers.py +1 -1
- claude_mpm/cli/parsers/base_parser.py +84 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/mcp_parser.py +79 -0
- claude_mpm/cli/parsers/oauth_parser.py +165 -0
- claude_mpm/cli/parsers/run_parser.py +10 -0
- claude_mpm/cli/parsers/skill_source_parser.py +4 -0
- claude_mpm/cli/parsers/skills_parser.py +5 -0
- claude_mpm/cli/startup.py +345 -40
- claude_mpm/cli/startup_display.py +76 -7
- claude_mpm/cli/startup_logging.py +2 -2
- claude_mpm/cli/startup_migrations.py +236 -0
- claude_mpm/cli/utils.py +7 -3
- claude_mpm/commander/__init__.py +78 -0
- claude_mpm/commander/adapters/__init__.py +60 -0
- claude_mpm/commander/adapters/auggie.py +260 -0
- claude_mpm/commander/adapters/base.py +288 -0
- claude_mpm/commander/adapters/claude_code.py +392 -0
- claude_mpm/commander/adapters/codex.py +237 -0
- claude_mpm/commander/adapters/communication.py +366 -0
- claude_mpm/commander/adapters/example_usage.py +310 -0
- claude_mpm/commander/adapters/mpm.py +389 -0
- claude_mpm/commander/adapters/registry.py +204 -0
- claude_mpm/commander/api/__init__.py +16 -0
- claude_mpm/commander/api/app.py +121 -0
- claude_mpm/commander/api/errors.py +133 -0
- claude_mpm/commander/api/routes/__init__.py +8 -0
- claude_mpm/commander/api/routes/events.py +184 -0
- claude_mpm/commander/api/routes/inbox.py +171 -0
- claude_mpm/commander/api/routes/messages.py +148 -0
- claude_mpm/commander/api/routes/projects.py +271 -0
- claude_mpm/commander/api/routes/sessions.py +226 -0
- claude_mpm/commander/api/routes/work.py +296 -0
- claude_mpm/commander/api/schemas.py +186 -0
- claude_mpm/commander/chat/__init__.py +7 -0
- claude_mpm/commander/chat/cli.py +149 -0
- claude_mpm/commander/chat/commands.py +124 -0
- claude_mpm/commander/chat/repl.py +1957 -0
- claude_mpm/commander/config.py +51 -0
- claude_mpm/commander/config_loader.py +115 -0
- claude_mpm/commander/core/__init__.py +10 -0
- claude_mpm/commander/core/block_manager.py +325 -0
- claude_mpm/commander/core/response_manager.py +323 -0
- claude_mpm/commander/daemon.py +603 -0
- claude_mpm/commander/env_loader.py +59 -0
- claude_mpm/commander/events/__init__.py +26 -0
- claude_mpm/commander/events/manager.py +392 -0
- claude_mpm/commander/frameworks/__init__.py +12 -0
- claude_mpm/commander/frameworks/base.py +233 -0
- claude_mpm/commander/frameworks/claude_code.py +58 -0
- claude_mpm/commander/frameworks/mpm.py +57 -0
- claude_mpm/commander/git/__init__.py +5 -0
- claude_mpm/commander/git/worktree_manager.py +212 -0
- claude_mpm/commander/inbox/__init__.py +16 -0
- claude_mpm/commander/inbox/dedup.py +128 -0
- claude_mpm/commander/inbox/inbox.py +224 -0
- claude_mpm/commander/inbox/models.py +70 -0
- claude_mpm/commander/instance_manager.py +868 -0
- claude_mpm/commander/llm/__init__.py +6 -0
- claude_mpm/commander/llm/openrouter_client.py +167 -0
- claude_mpm/commander/llm/summarizer.py +70 -0
- claude_mpm/commander/memory/__init__.py +45 -0
- claude_mpm/commander/memory/compression.py +347 -0
- claude_mpm/commander/memory/embeddings.py +230 -0
- claude_mpm/commander/memory/entities.py +310 -0
- claude_mpm/commander/memory/example_usage.py +290 -0
- claude_mpm/commander/memory/integration.py +325 -0
- claude_mpm/commander/memory/search.py +381 -0
- claude_mpm/commander/memory/store.py +657 -0
- claude_mpm/commander/models/__init__.py +18 -0
- claude_mpm/commander/models/events.py +127 -0
- claude_mpm/commander/models/project.py +162 -0
- claude_mpm/commander/models/work.py +214 -0
- claude_mpm/commander/parsing/__init__.py +20 -0
- claude_mpm/commander/parsing/extractor.py +132 -0
- claude_mpm/commander/parsing/output_parser.py +270 -0
- claude_mpm/commander/parsing/patterns.py +100 -0
- claude_mpm/commander/persistence/__init__.py +11 -0
- claude_mpm/commander/persistence/event_store.py +274 -0
- claude_mpm/commander/persistence/state_store.py +403 -0
- claude_mpm/commander/persistence/work_store.py +164 -0
- claude_mpm/commander/polling/__init__.py +13 -0
- claude_mpm/commander/polling/event_detector.py +104 -0
- claude_mpm/commander/polling/output_buffer.py +49 -0
- claude_mpm/commander/polling/output_poller.py +153 -0
- claude_mpm/commander/project_session.py +268 -0
- claude_mpm/commander/proxy/__init__.py +12 -0
- claude_mpm/commander/proxy/formatter.py +89 -0
- claude_mpm/commander/proxy/output_handler.py +191 -0
- claude_mpm/commander/proxy/relay.py +155 -0
- claude_mpm/commander/registry.py +410 -0
- claude_mpm/commander/runtime/__init__.py +10 -0
- claude_mpm/commander/runtime/executor.py +191 -0
- claude_mpm/commander/runtime/monitor.py +346 -0
- claude_mpm/commander/session/__init__.py +6 -0
- claude_mpm/commander/session/context.py +81 -0
- claude_mpm/commander/session/manager.py +59 -0
- claude_mpm/commander/tmux_orchestrator.py +362 -0
- claude_mpm/commander/web/__init__.py +1 -0
- claude_mpm/commander/work/__init__.py +30 -0
- claude_mpm/commander/work/executor.py +207 -0
- claude_mpm/commander/work/queue.py +405 -0
- claude_mpm/commander/workflow/__init__.py +27 -0
- claude_mpm/commander/workflow/event_handler.py +241 -0
- claude_mpm/commander/workflow/notifier.py +146 -0
- claude_mpm/commands/mpm-config.md +8 -0
- claude_mpm/commands/mpm-doctor.md +8 -0
- claude_mpm/commands/mpm-help.md +8 -0
- claude_mpm/commands/mpm-init.md +8 -0
- claude_mpm/commands/mpm-monitor.md +8 -0
- claude_mpm/commands/mpm-organize.md +8 -0
- claude_mpm/commands/mpm-postmortem.md +8 -0
- claude_mpm/commands/mpm-session-resume.md +9 -1
- claude_mpm/commands/mpm-status.md +8 -0
- claude_mpm/commands/mpm-ticket-view.md +8 -0
- claude_mpm/commands/mpm-version.md +8 -0
- claude_mpm/commands/mpm.md +8 -0
- claude_mpm/config/agent_presets.py +8 -7
- claude_mpm/config/skill_sources.py +16 -0
- claude_mpm/constants.py +5 -0
- claude_mpm/core/claude_runner.py +152 -0
- claude_mpm/core/config.py +35 -22
- claude_mpm/core/config_constants.py +74 -9
- claude_mpm/core/constants.py +56 -12
- claude_mpm/core/hook_manager.py +53 -4
- claude_mpm/core/interactive_session.py +5 -4
- claude_mpm/core/logger.py +26 -9
- claude_mpm/core/logging_utils.py +39 -13
- claude_mpm/core/network_config.py +148 -0
- claude_mpm/core/oneshot_session.py +7 -6
- claude_mpm/core/output_style_manager.py +52 -12
- claude_mpm/core/socketio_pool.py +47 -15
- claude_mpm/core/unified_config.py +10 -6
- claude_mpm/core/unified_paths.py +68 -80
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
- claude_mpm/dashboard/static/svelte-build/index.html +9 -9
- claude_mpm/experimental/cli_enhancements.py +2 -1
- claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
- claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
- claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +466 -136
- claude_mpm/hooks/claude_hooks/hook_handler.py +204 -104
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +291 -59
- claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
- claude_mpm/hooks/claude_hooks/response_tracking.py +43 -60
- claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +41 -26
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
- claude_mpm/hooks/claude_hooks/services/container.py +326 -0
- claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +75 -77
- claude_mpm/hooks/session_resume_hook.py +89 -1
- claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
- claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
- claude_mpm/init.py +22 -15
- claude_mpm/mcp/__init__.py +9 -0
- claude_mpm/mcp/google_workspace_server.py +610 -0
- claude_mpm/scripts/claude-hook-handler.sh +46 -19
- claude_mpm/services/agents/agent_recommendation_service.py +8 -8
- claude_mpm/services/agents/agent_selection_service.py +2 -2
- claude_mpm/services/agents/cache_git_manager.py +1 -1
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
- claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
- claude_mpm/services/cli/__init__.py +3 -0
- claude_mpm/services/cli/incremental_pause_manager.py +561 -0
- claude_mpm/services/cli/session_resume_helper.py +10 -2
- claude_mpm/services/command_deployment_service.py +44 -26
- claude_mpm/services/delegation_detector.py +175 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
- claude_mpm/services/diagnostics/models.py +14 -1
- claude_mpm/services/event_log.py +325 -0
- claude_mpm/services/hook_installer_service.py +77 -8
- claude_mpm/services/infrastructure/__init__.py +4 -0
- claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
- claude_mpm/services/mcp_config_manager.py +99 -19
- claude_mpm/services/mcp_service_registry.py +294 -0
- claude_mpm/services/monitor/daemon_manager.py +15 -4
- claude_mpm/services/monitor/management/lifecycle.py +8 -2
- claude_mpm/services/monitor/server.py +111 -16
- claude_mpm/services/pm_skills_deployer.py +261 -87
- claude_mpm/services/skills/git_skill_source_manager.py +130 -10
- claude_mpm/services/skills/selective_skill_deployer.py +142 -16
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills_deployer.py +31 -5
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/skills/__init__.py +2 -1
- claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
- claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
- claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
- claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
- claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
- claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
- claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
- claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
- claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
- claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
- claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
- claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
- claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
- claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
- claude_mpm/skills/bundled/pm/{pm-teaching-mode → mpm-teaching-mode}/SKILL.md +2 -2
- claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
- claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
- claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
- claude_mpm/skills/registry.py +295 -90
- claude_mpm/skills/skill_manager.py +4 -4
- claude_mpm-5.6.76.dist-info/METADATA +416 -0
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/RECORD +312 -175
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/WHEEL +1 -1
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/entry_points.txt +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
- claude_mpm-5.4.85.dist-info/METADATA +0 -1023
- /claude_mpm/skills/bundled/pm/{pm-bug-reporting/pm-bug-reporting.md → mpm-bug-reporting/SKILL.md} +0 -0
- /claude_mpm/skills/bundled/pm/{pm-delegation-patterns → mpm-delegation-patterns}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-git-file-tracking → mpm-git-file-tracking}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-pr-workflow → mpm-pr-workflow}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-ticketing-integration → mpm-ticketing-integration}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-verification-protocols → mpm-verification-protocols}/SKILL.md +0 -0
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"""MCP service management commands for claude-mpm CLI.
|
|
2
|
+
|
|
3
|
+
This module provides enable, disable, and list operations for MCP services
|
|
4
|
+
using the service registry for configuration generation.
|
|
5
|
+
|
|
6
|
+
WHY: Enables users to easily enable/disable MCP services with proper
|
|
7
|
+
credential handling and configuration management.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import getpass
|
|
11
|
+
import json
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import TYPE_CHECKING
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from argparse import Namespace
|
|
17
|
+
from logging import Logger
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class MCPServiceCommands:
|
|
21
|
+
"""Command handlers for MCP service management."""
|
|
22
|
+
|
|
23
|
+
# Configuration file paths
|
|
24
|
+
GLOBAL_CONFIG = Path.home() / ".claude.json"
|
|
25
|
+
PROJECT_CONFIG = Path(".mcp.json")
|
|
26
|
+
|
|
27
|
+
def __init__(self, logger: "Logger") -> None:
|
|
28
|
+
"""Initialize the command handler.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
logger: Logger instance for output
|
|
32
|
+
"""
|
|
33
|
+
self.logger = logger
|
|
34
|
+
|
|
35
|
+
def enable_service(self, args: "Namespace") -> int:
|
|
36
|
+
"""Enable an MCP service in configuration.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
args: Parsed command arguments with:
|
|
40
|
+
- service_name: Name of service to enable
|
|
41
|
+
- interactive: Whether to prompt for credentials
|
|
42
|
+
- env: List of KEY=VALUE strings
|
|
43
|
+
- use_global: Use global config instead of project
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
Exit code (0 for success, 1 for error)
|
|
47
|
+
"""
|
|
48
|
+
from ...services.mcp_service_registry import MCPServiceRegistry
|
|
49
|
+
|
|
50
|
+
service_name = args.service_name
|
|
51
|
+
|
|
52
|
+
# Check if service exists in registry
|
|
53
|
+
service = MCPServiceRegistry.get(service_name)
|
|
54
|
+
if not service:
|
|
55
|
+
available = MCPServiceRegistry.list_names()
|
|
56
|
+
print(f"Error: Unknown service '{service_name}'")
|
|
57
|
+
print(f"Available services: {', '.join(available)}")
|
|
58
|
+
return 1
|
|
59
|
+
|
|
60
|
+
# Parse environment variables from --env flags
|
|
61
|
+
env_vars: dict[str, str] = {}
|
|
62
|
+
if args.env:
|
|
63
|
+
for env_str in args.env:
|
|
64
|
+
if "=" not in env_str:
|
|
65
|
+
print(f"Error: Invalid env format '{env_str}'. Use KEY=VALUE")
|
|
66
|
+
return 1
|
|
67
|
+
key, value = env_str.split("=", 1)
|
|
68
|
+
env_vars[key] = value
|
|
69
|
+
|
|
70
|
+
# Interactive mode: prompt for required env vars
|
|
71
|
+
if args.interactive:
|
|
72
|
+
for var in service.required_env:
|
|
73
|
+
if var not in env_vars:
|
|
74
|
+
# Use getpass for sensitive values (tokens, keys, etc.)
|
|
75
|
+
if any(
|
|
76
|
+
keyword in var.upper()
|
|
77
|
+
for keyword in [
|
|
78
|
+
"TOKEN",
|
|
79
|
+
"KEY",
|
|
80
|
+
"SECRET",
|
|
81
|
+
"PASSWORD",
|
|
82
|
+
"CREDENTIAL",
|
|
83
|
+
]
|
|
84
|
+
):
|
|
85
|
+
value = getpass.getpass(f"Enter {var}: ")
|
|
86
|
+
else:
|
|
87
|
+
value = input(f"Enter {var}: ")
|
|
88
|
+
if value:
|
|
89
|
+
env_vars[var] = value
|
|
90
|
+
|
|
91
|
+
# Validate required environment variables
|
|
92
|
+
is_valid, missing = MCPServiceRegistry.validate_env(service, env_vars)
|
|
93
|
+
if not is_valid:
|
|
94
|
+
print(
|
|
95
|
+
f"Error: Missing required environment variables: {', '.join(missing)}"
|
|
96
|
+
)
|
|
97
|
+
print(f"Use --env {missing[0]}=VALUE or --interactive to provide them")
|
|
98
|
+
return 1
|
|
99
|
+
|
|
100
|
+
# Generate service configuration
|
|
101
|
+
config = MCPServiceRegistry.generate_config(service, env_vars)
|
|
102
|
+
|
|
103
|
+
# Determine config file path
|
|
104
|
+
config_path = self.GLOBAL_CONFIG if args.use_global else self.PROJECT_CONFIG
|
|
105
|
+
|
|
106
|
+
# Load existing config or create new
|
|
107
|
+
existing_config = self._load_config(config_path)
|
|
108
|
+
|
|
109
|
+
# Add/update service in mcpServers section
|
|
110
|
+
if "mcpServers" not in existing_config:
|
|
111
|
+
existing_config["mcpServers"] = {}
|
|
112
|
+
|
|
113
|
+
existing_config["mcpServers"][service_name] = config
|
|
114
|
+
|
|
115
|
+
# Save configuration
|
|
116
|
+
if self._save_config(config_path, existing_config):
|
|
117
|
+
location = (
|
|
118
|
+
"global (~/.claude.json)" if args.use_global else "project (.mcp.json)"
|
|
119
|
+
)
|
|
120
|
+
print(f"Enabled '{service_name}' in {location}")
|
|
121
|
+
print(f"Description: {service.description}")
|
|
122
|
+
|
|
123
|
+
if service.optional_env:
|
|
124
|
+
print(
|
|
125
|
+
f"\nOptional environment variables: {', '.join(service.optional_env)}"
|
|
126
|
+
)
|
|
127
|
+
print("Use --env VAR=VALUE to set them")
|
|
128
|
+
|
|
129
|
+
return 0
|
|
130
|
+
print(f"Error: Failed to save configuration to {config_path}")
|
|
131
|
+
return 1
|
|
132
|
+
|
|
133
|
+
def disable_service(self, args: "Namespace") -> int:
|
|
134
|
+
"""Disable an MCP service from configuration.
|
|
135
|
+
|
|
136
|
+
This removes the service from the configuration file but does NOT
|
|
137
|
+
uninstall the underlying package.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
args: Parsed command arguments with:
|
|
141
|
+
- service_name: Name of service to disable
|
|
142
|
+
- use_global: Use global config instead of project
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Exit code (0 for success, 1 for error)
|
|
146
|
+
"""
|
|
147
|
+
service_name = args.service_name
|
|
148
|
+
config_path = self.GLOBAL_CONFIG if args.use_global else self.PROJECT_CONFIG
|
|
149
|
+
|
|
150
|
+
# Load existing config
|
|
151
|
+
existing_config = self._load_config(config_path)
|
|
152
|
+
|
|
153
|
+
# Check if service exists in config
|
|
154
|
+
if "mcpServers" not in existing_config:
|
|
155
|
+
print(f"Error: No MCP services configured in {config_path}")
|
|
156
|
+
return 1
|
|
157
|
+
|
|
158
|
+
if service_name not in existing_config["mcpServers"]:
|
|
159
|
+
print(f"Error: Service '{service_name}' is not enabled")
|
|
160
|
+
enabled = list(existing_config["mcpServers"].keys())
|
|
161
|
+
if enabled:
|
|
162
|
+
print(f"Enabled services: {', '.join(enabled)}")
|
|
163
|
+
return 1
|
|
164
|
+
|
|
165
|
+
# Remove service from config
|
|
166
|
+
del existing_config["mcpServers"][service_name]
|
|
167
|
+
|
|
168
|
+
# Save configuration
|
|
169
|
+
if self._save_config(config_path, existing_config):
|
|
170
|
+
location = (
|
|
171
|
+
"global (~/.claude.json)" if args.use_global else "project (.mcp.json)"
|
|
172
|
+
)
|
|
173
|
+
print(f"Disabled '{service_name}' in {location}")
|
|
174
|
+
print(
|
|
175
|
+
"Note: The package is still installed. Use pipx/uvx to uninstall if needed."
|
|
176
|
+
)
|
|
177
|
+
return 0
|
|
178
|
+
print(f"Error: Failed to save configuration to {config_path}")
|
|
179
|
+
return 1
|
|
180
|
+
|
|
181
|
+
def list_services(self, args: "Namespace") -> int:
|
|
182
|
+
"""List MCP services (available and/or enabled).
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
args: Parsed command arguments with:
|
|
186
|
+
- available: Show all available services from registry
|
|
187
|
+
- enabled: Show only enabled services
|
|
188
|
+
- use_global: Check global config instead of project
|
|
189
|
+
- verbose: Show detailed information
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
Exit code (0 for success)
|
|
193
|
+
"""
|
|
194
|
+
from ...services.mcp_service_registry import MCPServiceRegistry
|
|
195
|
+
|
|
196
|
+
config_path = self.GLOBAL_CONFIG if args.use_global else self.PROJECT_CONFIG
|
|
197
|
+
existing_config = self._load_config(config_path)
|
|
198
|
+
enabled_services = existing_config.get("mcpServers", {})
|
|
199
|
+
|
|
200
|
+
# Default: show both available and enabled
|
|
201
|
+
show_available = args.available or not (args.available or args.enabled)
|
|
202
|
+
show_enabled = args.enabled or not (args.available or args.enabled)
|
|
203
|
+
|
|
204
|
+
if show_available:
|
|
205
|
+
print("Available MCP Services:")
|
|
206
|
+
print("-" * 60)
|
|
207
|
+
for service in MCPServiceRegistry.list_all():
|
|
208
|
+
status = "[enabled]" if service.name in enabled_services else ""
|
|
209
|
+
default_marker = " (default)" if service.enabled_by_default else ""
|
|
210
|
+
print(f" {service.name:<25} {status:>10}{default_marker}")
|
|
211
|
+
if args.verbose:
|
|
212
|
+
print(f" Description: {service.description}")
|
|
213
|
+
print(f" Package: {service.package}")
|
|
214
|
+
print(f" Install: {service.install_method.value}")
|
|
215
|
+
if service.required_env:
|
|
216
|
+
print(f" Required env: {', '.join(service.required_env)}")
|
|
217
|
+
if service.optional_env:
|
|
218
|
+
print(f" Optional env: {', '.join(service.optional_env)}")
|
|
219
|
+
print()
|
|
220
|
+
print()
|
|
221
|
+
|
|
222
|
+
if show_enabled:
|
|
223
|
+
location = (
|
|
224
|
+
"global (~/.claude.json)" if args.use_global else "project (.mcp.json)"
|
|
225
|
+
)
|
|
226
|
+
print(f"Enabled Services ({location}):")
|
|
227
|
+
print("-" * 60)
|
|
228
|
+
if not enabled_services:
|
|
229
|
+
print(" No services enabled")
|
|
230
|
+
else:
|
|
231
|
+
for name, config in enabled_services.items():
|
|
232
|
+
registry_service = MCPServiceRegistry.get(name)
|
|
233
|
+
if registry_service:
|
|
234
|
+
print(f" {name:<25} [registered]")
|
|
235
|
+
if args.verbose:
|
|
236
|
+
print(f" Description: {registry_service.description}")
|
|
237
|
+
else:
|
|
238
|
+
print(f" {name:<25} [custom]")
|
|
239
|
+
if args.verbose:
|
|
240
|
+
print(f" Command: {config.get('command', 'N/A')}")
|
|
241
|
+
if "args" in config:
|
|
242
|
+
print(f" Args: {config['args']}")
|
|
243
|
+
if "env" in config:
|
|
244
|
+
# Mask sensitive values
|
|
245
|
+
env_display = {}
|
|
246
|
+
for k, v in config.get("env", {}).items():
|
|
247
|
+
if any(
|
|
248
|
+
keyword in k.upper()
|
|
249
|
+
for keyword in [
|
|
250
|
+
"TOKEN",
|
|
251
|
+
"KEY",
|
|
252
|
+
"SECRET",
|
|
253
|
+
"PASSWORD",
|
|
254
|
+
]
|
|
255
|
+
):
|
|
256
|
+
env_display[k] = "***"
|
|
257
|
+
else:
|
|
258
|
+
env_display[k] = v
|
|
259
|
+
print(f" Env: {env_display}")
|
|
260
|
+
print()
|
|
261
|
+
|
|
262
|
+
return 0
|
|
263
|
+
|
|
264
|
+
def _load_config(self, path: Path) -> dict:
|
|
265
|
+
"""Load configuration from a JSON file.
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
path: Path to the configuration file
|
|
269
|
+
|
|
270
|
+
Returns:
|
|
271
|
+
Configuration dictionary (empty if file doesn't exist)
|
|
272
|
+
"""
|
|
273
|
+
if not path.exists():
|
|
274
|
+
return {}
|
|
275
|
+
try:
|
|
276
|
+
with open(path) as f:
|
|
277
|
+
data = json.load(f)
|
|
278
|
+
return dict(data) if isinstance(data, dict) else {}
|
|
279
|
+
except json.JSONDecodeError as e:
|
|
280
|
+
self.logger.warning(f"Invalid JSON in {path}: {e}")
|
|
281
|
+
return {}
|
|
282
|
+
except OSError as e:
|
|
283
|
+
self.logger.warning(f"Failed to read {path}: {e}")
|
|
284
|
+
return {}
|
|
285
|
+
|
|
286
|
+
def _save_config(self, path: Path, config: dict) -> bool:
|
|
287
|
+
"""Save configuration to a JSON file.
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
path: Path to the configuration file
|
|
291
|
+
config: Configuration dictionary to save
|
|
292
|
+
|
|
293
|
+
Returns:
|
|
294
|
+
True if saved successfully, False otherwise
|
|
295
|
+
"""
|
|
296
|
+
try:
|
|
297
|
+
# Ensure parent directory exists
|
|
298
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
299
|
+
with open(path, "w") as f:
|
|
300
|
+
json.dump(config, f, indent=2)
|
|
301
|
+
return True
|
|
302
|
+
except OSError as e:
|
|
303
|
+
self.logger.error(f"Failed to write {path}: {e}")
|
|
304
|
+
return False
|
|
@@ -118,7 +118,7 @@ class MonitorCommand(BaseCommand):
|
|
|
118
118
|
# Check if it's actually running
|
|
119
119
|
if not self.daemon.lifecycle.is_running():
|
|
120
120
|
return CommandResult.error_result(
|
|
121
|
-
"Monitor daemon failed to start. Check ~/.claude-mpm/monitor-daemon
|
|
121
|
+
"Monitor daemon failed to start. Check ~/.claude-mpm/logs/monitor-daemon-*.log for details."
|
|
122
122
|
)
|
|
123
123
|
|
|
124
124
|
# Get the actual PID
|
|
@@ -146,7 +146,7 @@ class MonitorCommand(BaseCommand):
|
|
|
146
146
|
pass
|
|
147
147
|
|
|
148
148
|
return CommandResult.error_result(
|
|
149
|
-
"Failed to start unified monitor daemon. Check ~/.claude-mpm/monitor-daemon
|
|
149
|
+
"Failed to start unified monitor daemon. Check ~/.claude-mpm/logs/monitor-daemon-*.log for details."
|
|
150
150
|
)
|
|
151
151
|
|
|
152
152
|
def _stop_monitor(self, args) -> CommandResult:
|
|
@@ -688,9 +688,9 @@ class MPMInitCommand:
|
|
|
688
688
|
return len(text) // 4
|
|
689
689
|
|
|
690
690
|
def _deploy_pm_skills(self) -> None:
|
|
691
|
-
"""Deploy PM skills templates to project .claude
|
|
691
|
+
"""Deploy PM skills templates to project .claude directory.
|
|
692
692
|
|
|
693
|
-
Copies PM skills from bundled templates to .claude
|
|
693
|
+
Copies PM skills from bundled templates to .claude/skills/
|
|
694
694
|
with version tracking and checksum validation.
|
|
695
695
|
"""
|
|
696
696
|
try:
|