claude-mpm 5.4.22__py3-none-any.whl → 5.6.34__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/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
- claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +374 -1257
- claude_mpm/agents/WORKFLOW.md +6 -253
- claude_mpm/agents/agent_loader.py +1 -1
- claude_mpm/agents/base_agent.json +31 -0
- claude_mpm/agents/frontmatter_validator.py +2 -2
- claude_mpm/agents/templates/circuit-breakers.md +26 -17
- claude_mpm/cli/__init__.py +5 -1
- claude_mpm/cli/commands/agent_state_manager.py +10 -10
- claude_mpm/cli/commands/agents.py +11 -13
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/auto_configure.py +4 -4
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/configure.py +621 -22
- claude_mpm/cli/commands/configure_agent_display.py +12 -0
- claude_mpm/cli/commands/hook_errors.py +60 -60
- claude_mpm/cli/commands/monitor.py +2 -2
- claude_mpm/cli/commands/mpm_init/core.py +72 -0
- claude_mpm/cli/commands/postmortem.py +1 -1
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +182 -32
- claude_mpm/cli/executor.py +130 -16
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +32 -52
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/parsers/base_parser.py +83 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -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 +2 -3
- claude_mpm/cli/startup.py +690 -386
- claude_mpm/cli/startup_display.py +74 -6
- claude_mpm/cli/startup_logging.py +2 -2
- 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 +146 -0
- claude_mpm/commander/chat/commands.py +96 -0
- claude_mpm/commander/chat/repl.py +310 -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 +332 -0
- claude_mpm/commander/frameworks/__init__.py +12 -0
- claude_mpm/commander/frameworks/base.py +146 -0
- claude_mpm/commander/frameworks/claude_code.py +58 -0
- claude_mpm/commander/frameworks/mpm.py +62 -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 +450 -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 +121 -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 +309 -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 +361 -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 +20 -249
- claude_mpm/commands/mpm-doctor.md +16 -21
- claude_mpm/commands/mpm-help.md +12 -205
- claude_mpm/commands/mpm-init.md +88 -506
- claude_mpm/commands/mpm-monitor.md +22 -401
- claude_mpm/commands/mpm-organize.md +70 -442
- claude_mpm/commands/mpm-postmortem.md +13 -107
- claude_mpm/commands/mpm-session-resume.md +20 -363
- claude_mpm/commands/mpm-status.md +13 -69
- claude_mpm/commands/mpm-ticket-view.md +60 -495
- claude_mpm/commands/mpm-version.md +13 -107
- 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 +1 -0
- claude_mpm/core/claude_runner.py +154 -2
- claude_mpm/core/config.py +37 -26
- claude_mpm/core/config_constants.py +74 -9
- claude_mpm/core/constants.py +56 -12
- claude_mpm/core/framework/loaders/agent_loader.py +1 -1
- claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
- claude_mpm/core/hook_manager.py +51 -3
- claude_mpm/core/interactive_session.py +12 -11
- 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/optimized_startup.py +61 -0
- claude_mpm/core/output_style_manager.py +66 -18
- claude_mpm/core/shared/config_loader.py +3 -1
- claude_mpm/core/socketio_pool.py +47 -15
- claude_mpm/core/unified_agent_registry.py +1 -1
- claude_mpm/core/unified_config.py +54 -8
- claude_mpm/core/unified_paths.py +95 -90
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- 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/1WZnGYqX.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
- 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/C3rbW_a-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
- 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 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- 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/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.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__/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/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +527 -136
- claude_mpm/hooks/claude_hooks/hook_handler.py +313 -99
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +206 -36
- 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/__pycache__/__init__.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__/container.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__/protocols.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 +67 -32
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
- claude_mpm/hooks/claude_hooks/services/container.py +310 -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/kuzu_memory_hook.py +5 -5
- 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 +276 -0
- claude_mpm/models/git_repository.py +3 -3
- claude_mpm/scripts/claude-hook-handler.sh +46 -19
- claude_mpm/services/agents/agent_builder.py +3 -3
- 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 +7 -7
- claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
- claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -2
- claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +39 -19
- 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/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +169 -26
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +101 -75
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/git_source_manager.py +23 -4
- claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
- claude_mpm/services/agents/sources/git_source_sync_service.py +121 -10
- claude_mpm/services/agents/startup_sync.py +27 -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_check.py +2 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
- 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/git/git_operations_service.py +8 -8
- 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/monitor/daemon_manager.py +15 -4
- claude_mpm/services/monitor/management/lifecycle.py +15 -3
- claude_mpm/services/monitor/server.py +571 -11
- claude_mpm/services/pm_skills_deployer.py +884 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/skills/git_skill_source_manager.py +281 -20
- claude_mpm/services/skills/selective_skill_deployer.py +211 -46
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills_deployer.py +192 -70
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +37 -6
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/core.py +262 -123
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/skills/__init__.py +2 -1
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- 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-bug-reporting/SKILL.md +248 -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-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
- claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -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-pr-workflow/SKILL.md +124 -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/mpm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
- claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
- claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +112 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/registry.py +295 -90
- claude_mpm/skills/skill_manager.py +98 -3
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/utils/agent_dependency_loader.py +115 -4
- claude_mpm/utils/agent_filters.py +1 -1
- claude_mpm/utils/migration.py +4 -4
- claude_mpm/utils/robust_installer.py +86 -21
- claude_mpm-5.6.34.dist-info/METADATA +393 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/RECORD +486 -145
- claude_mpm-5.4.22.dist-info/METADATA +0 -996
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Centralized network port configuration for Claude MPM.
|
|
2
|
+
|
|
3
|
+
This module provides the single source of truth for all network port defaults
|
|
4
|
+
and environment variable names used throughout the MPM system.
|
|
5
|
+
|
|
6
|
+
WHY: Previously, port defaults were hardcoded in multiple locations (config.py,
|
|
7
|
+
constants.py, commander/config.py, CLI parsers), leading to inconsistencies and
|
|
8
|
+
difficulty maintaining different defaults per service.
|
|
9
|
+
|
|
10
|
+
USAGE:
|
|
11
|
+
from claude_mpm.core.network_config import NetworkPorts
|
|
12
|
+
|
|
13
|
+
# Get default ports
|
|
14
|
+
monitor_port = NetworkPorts.MONITOR_DEFAULT
|
|
15
|
+
commander_port = NetworkPorts.COMMANDER_DEFAULT
|
|
16
|
+
|
|
17
|
+
# Get from environment with fallback
|
|
18
|
+
port = NetworkPorts.get_monitor_port()
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
from typing import Optional
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class NetworkPorts:
|
|
26
|
+
"""Network port configuration with different defaults for each service.
|
|
27
|
+
|
|
28
|
+
Service Default Ports:
|
|
29
|
+
- Monitor: 8765 (user's preferred default)
|
|
30
|
+
- Commander: 8766
|
|
31
|
+
- Dashboard: 8767
|
|
32
|
+
- SocketIO: 8768
|
|
33
|
+
|
|
34
|
+
Port Range: 8765-8785 (21 ports available)
|
|
35
|
+
|
|
36
|
+
Environment Variables:
|
|
37
|
+
- CLAUDE_MPM_MONITOR_PORT: Override monitor port
|
|
38
|
+
- CLAUDE_MPM_COMMANDER_PORT: Override commander port
|
|
39
|
+
- CLAUDE_MPM_DASHBOARD_PORT: Override dashboard port
|
|
40
|
+
- CLAUDE_MPM_SOCKETIO_PORT: Override socketio port
|
|
41
|
+
- CLAUDE_MPM_DEFAULT_HOST: Override default host (default: 127.0.0.1)
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
# Default ports for each service
|
|
45
|
+
MONITOR_DEFAULT = 8765
|
|
46
|
+
COMMANDER_DEFAULT = 8766
|
|
47
|
+
DASHBOARD_DEFAULT = 8767
|
|
48
|
+
SOCKETIO_DEFAULT = 8768
|
|
49
|
+
|
|
50
|
+
# Port range configuration
|
|
51
|
+
PORT_RANGE_START = 8765
|
|
52
|
+
PORT_RANGE_END = 8785
|
|
53
|
+
|
|
54
|
+
# Default host
|
|
55
|
+
DEFAULT_HOST = "127.0.0.1"
|
|
56
|
+
|
|
57
|
+
# Environment variable names
|
|
58
|
+
ENV_MONITOR_PORT = "CLAUDE_MPM_MONITOR_PORT"
|
|
59
|
+
ENV_COMMANDER_PORT = "CLAUDE_MPM_COMMANDER_PORT"
|
|
60
|
+
ENV_DASHBOARD_PORT = "CLAUDE_MPM_DASHBOARD_PORT"
|
|
61
|
+
ENV_SOCKETIO_PORT = "CLAUDE_MPM_SOCKETIO_PORT"
|
|
62
|
+
ENV_DEFAULT_HOST = "CLAUDE_MPM_DEFAULT_HOST"
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def get_monitor_port(cls, default: Optional[int] = None) -> int:
|
|
66
|
+
"""Get monitor port from environment or default.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
default: Optional override default (if not provided, uses MONITOR_DEFAULT)
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Port number from environment or default
|
|
73
|
+
"""
|
|
74
|
+
if default is None:
|
|
75
|
+
default = cls.MONITOR_DEFAULT
|
|
76
|
+
return int(os.getenv(cls.ENV_MONITOR_PORT, default))
|
|
77
|
+
|
|
78
|
+
@classmethod
|
|
79
|
+
def get_commander_port(cls, default: Optional[int] = None) -> int:
|
|
80
|
+
"""Get commander port from environment or default.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
default: Optional override default (if not provided, uses COMMANDER_DEFAULT)
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Port number from environment or default
|
|
87
|
+
"""
|
|
88
|
+
if default is None:
|
|
89
|
+
default = cls.COMMANDER_DEFAULT
|
|
90
|
+
return int(os.getenv(cls.ENV_COMMANDER_PORT, default))
|
|
91
|
+
|
|
92
|
+
@classmethod
|
|
93
|
+
def get_dashboard_port(cls, default: Optional[int] = None) -> int:
|
|
94
|
+
"""Get dashboard port from environment or default.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
default: Optional override default (if not provided, uses DASHBOARD_DEFAULT)
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Port number from environment or default
|
|
101
|
+
"""
|
|
102
|
+
if default is None:
|
|
103
|
+
default = cls.DASHBOARD_DEFAULT
|
|
104
|
+
return int(os.getenv(cls.ENV_DASHBOARD_PORT, default))
|
|
105
|
+
|
|
106
|
+
@classmethod
|
|
107
|
+
def get_socketio_port(cls, default: Optional[int] = None) -> int:
|
|
108
|
+
"""Get socketio port from environment or default.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
default: Optional override default (if not provided, uses SOCKETIO_DEFAULT)
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Port number from environment or default
|
|
115
|
+
"""
|
|
116
|
+
if default is None:
|
|
117
|
+
default = cls.SOCKETIO_DEFAULT
|
|
118
|
+
return int(os.getenv(cls.ENV_SOCKETIO_PORT, default))
|
|
119
|
+
|
|
120
|
+
@classmethod
|
|
121
|
+
def get_default_host(cls) -> str:
|
|
122
|
+
"""Get default host from environment or default.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Host address from environment or DEFAULT_HOST
|
|
126
|
+
"""
|
|
127
|
+
return os.getenv(cls.ENV_DEFAULT_HOST, cls.DEFAULT_HOST)
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
def get_port_range(cls) -> range:
|
|
131
|
+
"""Get the valid port range.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Range object from PORT_RANGE_START to PORT_RANGE_END (inclusive)
|
|
135
|
+
"""
|
|
136
|
+
return range(cls.PORT_RANGE_START, cls.PORT_RANGE_END + 1)
|
|
137
|
+
|
|
138
|
+
@classmethod
|
|
139
|
+
def is_port_in_range(cls, port: int) -> bool:
|
|
140
|
+
"""Check if port is within valid range.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
port: Port number to check
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
True if port is in valid range, False otherwise
|
|
147
|
+
"""
|
|
148
|
+
return cls.PORT_RANGE_START <= port <= cls.PORT_RANGE_END
|
|
@@ -11,7 +11,7 @@ defines the interface it needs.
|
|
|
11
11
|
|
|
12
12
|
import contextlib
|
|
13
13
|
import os
|
|
14
|
-
import subprocess
|
|
14
|
+
import subprocess # nosec B404
|
|
15
15
|
import tempfile
|
|
16
16
|
import time
|
|
17
17
|
import uuid
|
|
@@ -86,11 +86,12 @@ class OneshotSession:
|
|
|
86
86
|
Returns:
|
|
87
87
|
True if successful, False otherwise
|
|
88
88
|
"""
|
|
89
|
-
#
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
# NOTE: System agents are deployed via reconciliation during startup.
|
|
90
|
+
# The reconciliation process respects user configuration and handles
|
|
91
|
+
# both native and custom mode deployment. No need to call setup_agents() here.
|
|
92
92
|
|
|
93
|
-
# Deploy project-specific agents
|
|
93
|
+
# Deploy project-specific agents from .claude-mpm/agents/
|
|
94
|
+
# This is separate from system agents and handles user-defined agents
|
|
94
95
|
self.runner.deploy_project_agents_to_claude()
|
|
95
96
|
|
|
96
97
|
return True
|
|
@@ -225,7 +226,7 @@ class OneshotSession:
|
|
|
225
226
|
if len(cmd) > 5:
|
|
226
227
|
self.logger.debug(f"Command has {len(cmd)} arguments total")
|
|
227
228
|
|
|
228
|
-
result = subprocess.run(
|
|
229
|
+
result = subprocess.run( # nosec B603
|
|
229
230
|
cmd, capture_output=True, text=True, env=env, check=False
|
|
230
231
|
)
|
|
231
232
|
|
|
@@ -165,6 +165,9 @@ class OptimizedStartup:
|
|
|
165
165
|
# Just setup agent registry, load on demand
|
|
166
166
|
self._setup_agent_registry()
|
|
167
167
|
|
|
168
|
+
# Verify PM skills after agent setup (non-blocking)
|
|
169
|
+
self._verify_pm_skills()
|
|
170
|
+
|
|
168
171
|
elapsed = time.time() - phase_start
|
|
169
172
|
self.metrics.phases["agents"] = elapsed
|
|
170
173
|
self.metrics.agent_time = elapsed
|
|
@@ -198,6 +201,64 @@ class OptimizedStartup:
|
|
|
198
201
|
|
|
199
202
|
return self.metrics
|
|
200
203
|
|
|
204
|
+
def _verify_pm_skills(self) -> None:
|
|
205
|
+
"""Verify PM skills are deployed. Non-blocking with warnings."""
|
|
206
|
+
try:
|
|
207
|
+
from claude_mpm.services.pm_skills_deployer import PMSkillsDeployerService
|
|
208
|
+
|
|
209
|
+
deployer = PMSkillsDeployerService()
|
|
210
|
+
project_dir = Path.cwd()
|
|
211
|
+
|
|
212
|
+
result = deployer.verify_pm_skills(project_dir)
|
|
213
|
+
|
|
214
|
+
if not result.verified:
|
|
215
|
+
for warning in result.warnings:
|
|
216
|
+
self.logger.warning(warning)
|
|
217
|
+
|
|
218
|
+
# Check if auto-deploy is enabled
|
|
219
|
+
if self._should_auto_deploy_pm_skills():
|
|
220
|
+
self.logger.info("Auto-deploying PM skills...")
|
|
221
|
+
deploy_result = deployer.deploy_pm_skills(project_dir)
|
|
222
|
+
if deploy_result.success:
|
|
223
|
+
self.logger.info(
|
|
224
|
+
f"PM skills deployed: {len(deploy_result.deployed)} deployed, "
|
|
225
|
+
f"{len(deploy_result.skipped)} skipped"
|
|
226
|
+
)
|
|
227
|
+
else:
|
|
228
|
+
self.logger.warning(
|
|
229
|
+
f"PM skills deployment had errors: {len(deploy_result.errors)}"
|
|
230
|
+
)
|
|
231
|
+
else:
|
|
232
|
+
# Count skills from registry
|
|
233
|
+
registry = deployer._load_registry(project_dir)
|
|
234
|
+
skill_count = len(registry.get("skills", []))
|
|
235
|
+
self.logger.debug(f"PM skills verified: {skill_count} skills")
|
|
236
|
+
|
|
237
|
+
except ImportError:
|
|
238
|
+
self.logger.debug("PM skills deployer not available")
|
|
239
|
+
except Exception as e:
|
|
240
|
+
self.logger.warning(f"PM skills verification failed: {e}")
|
|
241
|
+
|
|
242
|
+
def _should_auto_deploy_pm_skills(self) -> bool:
|
|
243
|
+
"""Check if auto-deploy is enabled via config.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
True if auto-deploy should be performed (default: True for convenience)
|
|
247
|
+
"""
|
|
248
|
+
# Default to True for convenience - PM skills are essential for PM agents
|
|
249
|
+
# Users can disable by setting environment variable or config
|
|
250
|
+
import os
|
|
251
|
+
|
|
252
|
+
# Check environment variable override
|
|
253
|
+
env_disable = os.environ.get(
|
|
254
|
+
"CLAUDE_MPM_DISABLE_AUTO_DEPLOY_PM_SKILLS", ""
|
|
255
|
+
).lower()
|
|
256
|
+
if env_disable in ("1", "true", "yes"):
|
|
257
|
+
return False
|
|
258
|
+
|
|
259
|
+
# Default to enabled
|
|
260
|
+
return True
|
|
261
|
+
|
|
201
262
|
def _setup_logging(self):
|
|
202
263
|
"""Setup basic logging (critical path)."""
|
|
203
264
|
# Minimal logging setup - already handled by logger module
|
|
@@ -13,7 +13,7 @@ Users can change it if they want, and the system will respect their choice.
|
|
|
13
13
|
|
|
14
14
|
import json
|
|
15
15
|
import re
|
|
16
|
-
import subprocess
|
|
16
|
+
import subprocess # nosec B404
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
from typing import Any, Dict, Literal, Optional, TypedDict, cast
|
|
19
19
|
|
|
@@ -27,7 +27,9 @@ _CACHED_CLAUDE_VERSION: Optional[str] = None
|
|
|
27
27
|
_VERSION_DETECTED: bool = False
|
|
28
28
|
|
|
29
29
|
# Output style types
|
|
30
|
-
OutputStyleType = Literal[
|
|
30
|
+
OutputStyleType = Literal[
|
|
31
|
+
"professional", "teaching", "research", "founders"
|
|
32
|
+
] # "founders" is deprecated, use "research"
|
|
31
33
|
|
|
32
34
|
|
|
33
35
|
class StyleConfig(TypedDict):
|
|
@@ -41,9 +43,10 @@ class StyleConfig(TypedDict):
|
|
|
41
43
|
class OutputStyleManager:
|
|
42
44
|
"""Manages output style deployment and version-based handling.
|
|
43
45
|
|
|
44
|
-
Supports
|
|
46
|
+
Supports three output styles:
|
|
45
47
|
- professional: Default Claude MPM style (claude-mpm.md)
|
|
46
|
-
- teaching: Adaptive teaching mode (claude-mpm-
|
|
48
|
+
- teaching: Adaptive teaching mode (claude-mpm-teacher.md)
|
|
49
|
+
- research: Codebase research mode for founders, PMs, and developers (claude-mpm-research.md)
|
|
47
50
|
"""
|
|
48
51
|
|
|
49
52
|
def __init__(self) -> None:
|
|
@@ -51,8 +54,8 @@ class OutputStyleManager:
|
|
|
51
54
|
self.logger = get_logger("output_style_manager") # type: ignore[misc]
|
|
52
55
|
self.claude_version = self._detect_claude_version()
|
|
53
56
|
|
|
54
|
-
# Deploy to ~/.claude/styles/ directory (
|
|
55
|
-
self.output_style_dir = Path.home() / ".claude" / "styles"
|
|
57
|
+
# Deploy to ~/.claude/output-styles/ directory (official Claude Code location)
|
|
58
|
+
self.output_style_dir = Path.home() / ".claude" / "output-styles"
|
|
56
59
|
self.settings_file = Path.home() / ".claude" / "settings.json"
|
|
57
60
|
|
|
58
61
|
# Style definitions
|
|
@@ -62,14 +65,29 @@ class OutputStyleManager:
|
|
|
62
65
|
/ "agents"
|
|
63
66
|
/ "CLAUDE_MPM_OUTPUT_STYLE.md",
|
|
64
67
|
target=self.output_style_dir / "claude-mpm.md",
|
|
65
|
-
name="
|
|
68
|
+
name="Claude MPM",
|
|
66
69
|
),
|
|
67
70
|
"teaching": StyleConfig(
|
|
68
71
|
source=Path(__file__).parent.parent
|
|
69
72
|
/ "agents"
|
|
70
73
|
/ "CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md",
|
|
71
|
-
target=self.output_style_dir / "claude-mpm-
|
|
72
|
-
name="
|
|
74
|
+
target=self.output_style_dir / "claude-mpm-teacher.md",
|
|
75
|
+
name="Claude MPM Teacher",
|
|
76
|
+
),
|
|
77
|
+
"research": StyleConfig(
|
|
78
|
+
source=Path(__file__).parent.parent
|
|
79
|
+
/ "agents"
|
|
80
|
+
/ "CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md",
|
|
81
|
+
target=self.output_style_dir / "claude-mpm-research.md",
|
|
82
|
+
name="Claude MPM Research",
|
|
83
|
+
),
|
|
84
|
+
# Backward compatibility alias (deprecated)
|
|
85
|
+
"founders": StyleConfig(
|
|
86
|
+
source=Path(__file__).parent.parent
|
|
87
|
+
/ "agents"
|
|
88
|
+
/ "CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md",
|
|
89
|
+
target=self.output_style_dir / "claude-mpm-research.md",
|
|
90
|
+
name="Claude MPM Research",
|
|
73
91
|
),
|
|
74
92
|
}
|
|
75
93
|
|
|
@@ -93,7 +111,7 @@ class OutputStyleManager:
|
|
|
93
111
|
|
|
94
112
|
try:
|
|
95
113
|
# Run claude --version command
|
|
96
|
-
result = subprocess.run(
|
|
114
|
+
result = subprocess.run( # nosec B603 B607
|
|
97
115
|
["claude", "--version"],
|
|
98
116
|
capture_output=True,
|
|
99
117
|
text=True,
|
|
@@ -279,6 +297,9 @@ class OutputStyleManager:
|
|
|
279
297
|
target_path = style_config["target"]
|
|
280
298
|
style_name = style_config["name"]
|
|
281
299
|
|
|
300
|
+
# Check if this is a fresh install (file doesn't exist yet)
|
|
301
|
+
is_fresh_install = not target_path.exists()
|
|
302
|
+
|
|
282
303
|
# If content not provided, read from source
|
|
283
304
|
if content is None:
|
|
284
305
|
content = self.extract_output_style_content(style=style)
|
|
@@ -292,7 +313,9 @@ class OutputStyleManager:
|
|
|
292
313
|
|
|
293
314
|
# Activate the style if requested
|
|
294
315
|
if activate:
|
|
295
|
-
self._activate_output_style(
|
|
316
|
+
self._activate_output_style(
|
|
317
|
+
style_name, is_fresh_install=is_fresh_install
|
|
318
|
+
)
|
|
296
319
|
|
|
297
320
|
return True
|
|
298
321
|
|
|
@@ -300,12 +323,21 @@ class OutputStyleManager:
|
|
|
300
323
|
self.logger.error(f"Failed to deploy {style} style: {e}")
|
|
301
324
|
return False
|
|
302
325
|
|
|
303
|
-
def _activate_output_style(
|
|
326
|
+
def _activate_output_style(
|
|
327
|
+
self, style_name: str = "Claude MPM", is_fresh_install: bool = False
|
|
328
|
+
) -> bool:
|
|
304
329
|
"""
|
|
305
330
|
Update Claude Code settings to activate a specific output style.
|
|
306
331
|
|
|
332
|
+
Only activates the style if:
|
|
333
|
+
1. No active style is currently set (first deployment), OR
|
|
334
|
+
2. This is a fresh install (style file didn't exist before deployment)
|
|
335
|
+
|
|
336
|
+
This preserves user preferences if they've manually changed their active style.
|
|
337
|
+
|
|
307
338
|
Args:
|
|
308
|
-
style_name: Name of the style to activate (e.g., "
|
|
339
|
+
style_name: Name of the style to activate (e.g., "Claude MPM", "Claude MPM Teacher")
|
|
340
|
+
is_fresh_install: Whether this is a fresh install (style file didn't exist before)
|
|
309
341
|
|
|
310
342
|
Returns:
|
|
311
343
|
True if activated successfully, False otherwise
|
|
@@ -324,8 +356,15 @@ class OutputStyleManager:
|
|
|
324
356
|
# Check current active style
|
|
325
357
|
current_style = settings.get("activeOutputStyle")
|
|
326
358
|
|
|
327
|
-
#
|
|
328
|
-
|
|
359
|
+
# Only set activeOutputStyle if:
|
|
360
|
+
# 1. No active style is set (first deployment), OR
|
|
361
|
+
# 2. Current style is "default" (not a real user preference), OR
|
|
362
|
+
# 3. This is a fresh install (file didn't exist before deployment)
|
|
363
|
+
should_activate = (
|
|
364
|
+
current_style is None or current_style == "default" or is_fresh_install
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
if should_activate and current_style != style_name:
|
|
329
368
|
settings["activeOutputStyle"] = style_name
|
|
330
369
|
|
|
331
370
|
# Ensure settings directory exists
|
|
@@ -340,7 +379,10 @@ class OutputStyleManager:
|
|
|
340
379
|
f"✅ Activated {style_name} output style (was: {current_style or 'none'})"
|
|
341
380
|
)
|
|
342
381
|
else:
|
|
343
|
-
self.logger.debug(
|
|
382
|
+
self.logger.debug(
|
|
383
|
+
f"Preserving user preference: {current_style or 'none'} "
|
|
384
|
+
f"(skipping activation of {style_name})"
|
|
385
|
+
)
|
|
344
386
|
|
|
345
387
|
return True
|
|
346
388
|
|
|
@@ -434,6 +476,10 @@ class OutputStyleManager:
|
|
|
434
476
|
"""
|
|
435
477
|
results: Dict[str, bool] = {}
|
|
436
478
|
|
|
479
|
+
# Check if professional style exists BEFORE deployment
|
|
480
|
+
# This determines if this is a fresh install
|
|
481
|
+
professional_style_existed = self.styles["professional"]["target"].exists()
|
|
482
|
+
|
|
437
483
|
for style_type_key in self.styles:
|
|
438
484
|
# Deploy without activation
|
|
439
485
|
# Cast is safe because we know self.styles keys are OutputStyleType
|
|
@@ -441,9 +487,11 @@ class OutputStyleManager:
|
|
|
441
487
|
success = self.deploy_output_style(style=style_type, activate=False)
|
|
442
488
|
results[style_type] = success
|
|
443
489
|
|
|
444
|
-
# Activate the default style if requested
|
|
490
|
+
# Activate the default style if requested AND this is first deployment
|
|
445
491
|
if activate_default and results.get("professional", False):
|
|
446
|
-
self._activate_output_style(
|
|
492
|
+
self._activate_output_style(
|
|
493
|
+
"Claude MPM", is_fresh_install=not professional_style_existed
|
|
494
|
+
)
|
|
447
495
|
|
|
448
496
|
return results
|
|
449
497
|
|
|
@@ -51,7 +51,9 @@ class ConfigLoader:
|
|
|
51
51
|
search_paths=[".", ".claude-mpm", "agents"],
|
|
52
52
|
env_prefix="CLAUDE_MPM_AGENT_",
|
|
53
53
|
defaults={"timeout": 30, "max_retries": 3, "log_level": "INFO"},
|
|
54
|
-
required_keys=[
|
|
54
|
+
required_keys=[
|
|
55
|
+
"name"
|
|
56
|
+
], # model is optional - defaults to sonnet if not specified
|
|
55
57
|
)
|
|
56
58
|
|
|
57
59
|
MEMORY_CONFIG = ConfigPattern(
|
claude_mpm/core/socketio_pool.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
1
|
"""Socket.IO connection pool for efficient client connection management.
|
|
3
2
|
|
|
4
3
|
This module provides a connection pool to reuse Socket.IO client connections,
|
|
@@ -31,12 +30,21 @@ except ImportError:
|
|
|
31
30
|
# Import constants for configuration
|
|
32
31
|
try:
|
|
33
32
|
from claude_mpm.core.constants import NetworkConfig
|
|
33
|
+
from claude_mpm.core.network_config import NetworkPorts
|
|
34
34
|
except ImportError:
|
|
35
35
|
# Fallback if constants module not available
|
|
36
|
+
class NetworkPorts:
|
|
37
|
+
MONITOR_DEFAULT = 8765
|
|
38
|
+
COMMANDER_DEFAULT = 8766
|
|
39
|
+
DASHBOARD_DEFAULT = 8767
|
|
40
|
+
SOCKETIO_DEFAULT = 8768
|
|
41
|
+
PORT_RANGE_START = 8765
|
|
42
|
+
PORT_RANGE_END = 8785
|
|
43
|
+
|
|
36
44
|
class NetworkConfig:
|
|
37
|
-
DEFAULT_DASHBOARD_PORT =
|
|
45
|
+
DEFAULT_DASHBOARD_PORT = 8767
|
|
38
46
|
SOCKETIO_PORT_RANGE = (8765, 8785)
|
|
39
|
-
DEFAULT_SOCKETIO_PORT =
|
|
47
|
+
DEFAULT_SOCKETIO_PORT = 8768
|
|
40
48
|
|
|
41
49
|
socketio = None
|
|
42
50
|
|
|
@@ -184,9 +192,14 @@ class SocketIOConnectionPool:
|
|
|
184
192
|
self.health_running = False
|
|
185
193
|
self.last_health_check = datetime.now(timezone.utc)
|
|
186
194
|
|
|
187
|
-
# Server configuration
|
|
188
|
-
self.
|
|
189
|
-
|
|
195
|
+
# Server configuration - use default immediately, update async
|
|
196
|
+
self.server_port = int(
|
|
197
|
+
os.environ.get(
|
|
198
|
+
"CLAUDE_MPM_SOCKETIO_PORT", str(NetworkConfig.DEFAULT_SOCKETIO_PORT)
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
self.server_url = f"http://localhost:{self.server_port}"
|
|
202
|
+
self._port_detection_complete = False
|
|
190
203
|
|
|
191
204
|
# Pool lifecycle
|
|
192
205
|
self._running = False
|
|
@@ -200,7 +213,10 @@ class SocketIOConnectionPool:
|
|
|
200
213
|
return
|
|
201
214
|
|
|
202
215
|
self._running = True
|
|
203
|
-
|
|
216
|
+
|
|
217
|
+
# Start async port detection in background (non-blocking)
|
|
218
|
+
# Default port is already set in __init__, this just updates if a better one is found
|
|
219
|
+
self._detect_server_async()
|
|
204
220
|
|
|
205
221
|
# Start batch processing thread
|
|
206
222
|
self.batch_running = True
|
|
@@ -266,14 +282,29 @@ class SocketIOConnectionPool:
|
|
|
266
282
|
|
|
267
283
|
self.logger.info("Socket.IO connection pool stopped")
|
|
268
284
|
|
|
285
|
+
def _detect_server_async(self):
|
|
286
|
+
"""Start server detection in background thread.
|
|
287
|
+
|
|
288
|
+
This runs port scanning asynchronously to avoid blocking the main thread.
|
|
289
|
+
The default port is already set in __init__, so this just updates if a better one is found.
|
|
290
|
+
"""
|
|
291
|
+
threading.Thread(
|
|
292
|
+
target=self._detect_server, daemon=True, name="port-detect"
|
|
293
|
+
).start()
|
|
294
|
+
|
|
269
295
|
def _detect_server(self):
|
|
270
|
-
"""Detect Socket.IO server configuration.
|
|
271
|
-
|
|
296
|
+
"""Detect Socket.IO server configuration.
|
|
297
|
+
|
|
298
|
+
This method scans ports to find a running Socket.IO server.
|
|
299
|
+
It's designed to be run in a background thread to avoid blocking.
|
|
300
|
+
"""
|
|
301
|
+
# Check environment variable first - if set, use it and skip detection
|
|
272
302
|
env_port = os.environ.get("CLAUDE_MPM_SOCKETIO_PORT")
|
|
273
303
|
if env_port:
|
|
274
304
|
try:
|
|
275
305
|
self.server_port = int(env_port)
|
|
276
306
|
self.server_url = f"http://localhost:{self.server_port}"
|
|
307
|
+
self._port_detection_complete = True
|
|
277
308
|
self.logger.debug(
|
|
278
309
|
f"Using Socket.IO server from environment: {self.server_url}"
|
|
279
310
|
)
|
|
@@ -302,19 +333,20 @@ class SocketIOConnectionPool:
|
|
|
302
333
|
for port in common_ports:
|
|
303
334
|
try:
|
|
304
335
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
305
|
-
|
|
336
|
+
# Use 10ms timeout (reduced from 50ms) for faster scanning
|
|
337
|
+
s.settimeout(0.01)
|
|
306
338
|
result = s.connect_ex(("localhost", port))
|
|
307
339
|
if result == 0:
|
|
308
340
|
self.server_port = port
|
|
309
341
|
self.server_url = f"http://localhost:{port}"
|
|
342
|
+
self._port_detection_complete = True
|
|
310
343
|
self.logger.debug(f"Detected Socket.IO server on port {port}")
|
|
311
344
|
return
|
|
312
|
-
except Exception:
|
|
345
|
+
except Exception: # nosec B112 - intentional: skip ports that fail
|
|
313
346
|
continue
|
|
314
347
|
|
|
315
|
-
#
|
|
316
|
-
self.
|
|
317
|
-
self.server_url = f"http://localhost:{self.server_port}"
|
|
348
|
+
# Keep default port set in __init__, mark detection complete
|
|
349
|
+
self._port_detection_complete = True
|
|
318
350
|
self.logger.debug(f"Using default Socket.IO server: {self.server_url}")
|
|
319
351
|
|
|
320
352
|
def _create_client(self) -> Optional[socketio.AsyncClient]:
|
|
@@ -579,7 +611,7 @@ class SocketIOConnectionPool:
|
|
|
579
611
|
loop.stop()
|
|
580
612
|
loop.run_until_complete(loop.shutdown_asyncgens())
|
|
581
613
|
loop.close()
|
|
582
|
-
except Exception:
|
|
614
|
+
except Exception: # nosec B110 - intentional: cleanup best-effort
|
|
583
615
|
pass
|
|
584
616
|
|
|
585
617
|
async def _connect_client(self, client: socketio.AsyncClient):
|
|
@@ -175,7 +175,7 @@ class UnifiedAgentRegistry:
|
|
|
175
175
|
self.discovery_paths.append(project_path)
|
|
176
176
|
|
|
177
177
|
# NOTE: .claude-mpm/agents/ is deprecated in the simplified architecture
|
|
178
|
-
# Source agents come from ~/.claude-mpm/cache/
|
|
178
|
+
# Source agents come from ~/.claude-mpm/cache/agents/
|
|
179
179
|
# Deployed agents go to .claude/agents/
|
|
180
180
|
|
|
181
181
|
# User-level agents (deprecated in simplified architecture)
|