claude-mpm 5.0.9__py3-none-any.whl → 5.6.23__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_OUTPUT_STYLE.md +115 -0
- claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +479 -616
- claude_mpm/agents/WORKFLOW.md +6 -253
- claude_mpm/agents/agent_loader.py +13 -44
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/frontmatter_validator.py +70 -2
- claude_mpm/agents/templates/circuit-breakers.md +457 -62
- claude_mpm/cli/__init__.py +5 -2
- 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 +177 -41
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/auto_configure.py +723 -236
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/config.py +88 -2
- claude_mpm/cli/commands/configure.py +1874 -170
- claude_mpm/cli/commands/configure_agent_display.py +27 -6
- 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 +232 -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 +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 +379 -204
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +141 -19
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +115 -60
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/parsers/agents_parser.py +54 -9
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +88 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/config_parser.py +153 -83
- 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 +1 -1
- claude_mpm/cli/startup.py +1017 -266
- 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 +36 -0
- claude_mpm/commands/mpm-doctor.md +16 -21
- claude_mpm/commands/mpm-help.md +12 -286
- claude_mpm/commands/mpm-init.md +88 -506
- claude_mpm/commands/mpm-monitor.md +22 -401
- claude_mpm/commands/mpm-organize.md +128 -0
- 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/agent_sources.py +27 -0
- 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/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/hook_manager.py +51 -3
- claude_mpm/core/interactive_session.py +12 -11
- claude_mpm/core/logger.py +39 -9
- claude_mpm/core/logging_utils.py +35 -11
- 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 +219 -44
- claude_mpm/core/shared/config_loader.py +3 -1
- claude_mpm/core/socketio_pool.py +16 -8
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +76 -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/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +479 -128
- claude_mpm/hooks/claude_hooks/hook_handler.py +254 -83
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +149 -18
- claude_mpm/hooks/claude_hooks/memory_integration.py +67 -19
- claude_mpm/hooks/claude_hooks/response_tracking.py +44 -62
- 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__/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 +69 -30
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
- claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
- claude_mpm/hooks/kuzu_memory_hook.py +5 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/hooks/session_resume_hook.py +89 -1
- claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
- claude_mpm/init.py +276 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +3 -3
- claude_mpm/scripts/claude-hook-handler.sh +87 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +0 -0
- 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/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 +6 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +42 -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/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 +348 -29
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +570 -68
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/git_source_manager.py +57 -4
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- 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 +129 -11
- claude_mpm/services/agents/startup_sync.py +27 -4
- 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/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 +81 -10
- 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_bus/config.py +3 -1
- claude_mpm/services/event_log.py +325 -0
- claude_mpm/services/git/git_operations_service.py +101 -16
- 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.py +9 -2
- claude_mpm/services/monitor/daemon_manager.py +54 -7
- claude_mpm/services/monitor/management/lifecycle.py +15 -3
- claude_mpm/services/monitor/server.py +796 -30
- claude_mpm/services/pm_skills_deployer.py +884 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/project_organizer.py +4 -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 +303 -12
- claude_mpm/services/skills/selective_skill_deployer.py +869 -0
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_deployer.py +294 -55
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/core.py +386 -108
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- 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 +17 -44
- claude_mpm/utils/gitignore.py +3 -0
- claude_mpm/utils/migration.py +4 -4
- claude_mpm/utils/robust_installer.py +86 -21
- claude_mpm-5.6.23.dist-info/METADATA +393 -0
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/RECORD +508 -261
- claude_mpm-5.6.23.dist-info/entry_points.txt +5 -0
- claude_mpm-5.6.23.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.6.23.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/OUTPUT_STYLE.md +0 -290
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +0 -1322
- 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/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/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.0.9.dist-info/METADATA +0 -1028
- claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
- claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/WHEEL +0 -0
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/top_level.txt +0 -0
|
@@ -5,6 +5,7 @@ This module handles:
|
|
|
5
5
|
2. Output style extraction from framework instructions
|
|
6
6
|
3. One-time deployment to Claude Code >= 1.0.83 at startup
|
|
7
7
|
4. Fallback injection for older versions
|
|
8
|
+
5. Support for multiple output styles (professional and teaching modes)
|
|
8
9
|
|
|
9
10
|
The output style is set once at startup and not monitored or enforced after that.
|
|
10
11
|
Users can change it if they want, and the system will respect their choice.
|
|
@@ -12,9 +13,9 @@ Users can change it if they want, and the system will respect their choice.
|
|
|
12
13
|
|
|
13
14
|
import json
|
|
14
15
|
import re
|
|
15
|
-
import subprocess
|
|
16
|
+
import subprocess # nosec B404
|
|
16
17
|
from pathlib import Path
|
|
17
|
-
from typing import Dict, Optional
|
|
18
|
+
from typing import Any, Dict, Literal, Optional, TypedDict, cast
|
|
18
19
|
|
|
19
20
|
from ..utils.imports import safe_import
|
|
20
21
|
|
|
@@ -25,22 +26,74 @@ get_logger = safe_import("claude_mpm.core.logger", "core.logger", ["get_logger"]
|
|
|
25
26
|
_CACHED_CLAUDE_VERSION: Optional[str] = None
|
|
26
27
|
_VERSION_DETECTED: bool = False
|
|
27
28
|
|
|
29
|
+
# Output style types
|
|
30
|
+
OutputStyleType = Literal[
|
|
31
|
+
"professional", "teaching", "research", "founders"
|
|
32
|
+
] # "founders" is deprecated, use "research"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class StyleConfig(TypedDict):
|
|
36
|
+
"""Configuration for an output style."""
|
|
37
|
+
|
|
38
|
+
source: Path
|
|
39
|
+
target: Path
|
|
40
|
+
name: str
|
|
41
|
+
|
|
28
42
|
|
|
29
43
|
class OutputStyleManager:
|
|
30
|
-
"""Manages output style deployment and version-based handling.
|
|
44
|
+
"""Manages output style deployment and version-based handling.
|
|
45
|
+
|
|
46
|
+
Supports three output styles:
|
|
47
|
+
- professional: Default Claude MPM style (claude-mpm.md)
|
|
48
|
+
- teaching: Adaptive teaching mode (claude-mpm-teacher.md)
|
|
49
|
+
- research: Codebase research mode for founders, PMs, and developers (claude-mpm-research.md)
|
|
50
|
+
"""
|
|
31
51
|
|
|
32
|
-
def __init__(self):
|
|
52
|
+
def __init__(self) -> None:
|
|
33
53
|
"""Initialize the output style manager."""
|
|
34
|
-
self.logger = get_logger("output_style_manager")
|
|
54
|
+
self.logger = get_logger("output_style_manager") # type: ignore[misc]
|
|
35
55
|
self.claude_version = self._detect_claude_version()
|
|
56
|
+
|
|
57
|
+
# Deploy to ~/.claude/output-styles/ directory (official Claude Code location)
|
|
36
58
|
self.output_style_dir = Path.home() / ".claude" / "output-styles"
|
|
37
|
-
self.output_style_path = self.output_style_dir / "claude-mpm.md"
|
|
38
59
|
self.settings_file = Path.home() / ".claude" / "settings.json"
|
|
39
60
|
|
|
40
|
-
#
|
|
41
|
-
self.
|
|
42
|
-
|
|
43
|
-
|
|
61
|
+
# Style definitions
|
|
62
|
+
self.styles: Dict[str, StyleConfig] = {
|
|
63
|
+
"professional": StyleConfig(
|
|
64
|
+
source=Path(__file__).parent.parent
|
|
65
|
+
/ "agents"
|
|
66
|
+
/ "CLAUDE_MPM_OUTPUT_STYLE.md",
|
|
67
|
+
target=self.output_style_dir / "claude-mpm.md",
|
|
68
|
+
name="Claude MPM",
|
|
69
|
+
),
|
|
70
|
+
"teaching": StyleConfig(
|
|
71
|
+
source=Path(__file__).parent.parent
|
|
72
|
+
/ "agents"
|
|
73
|
+
/ "CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md",
|
|
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",
|
|
91
|
+
),
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
# Default style path (for backward compatibility)
|
|
95
|
+
self.output_style_path = self.styles["professional"]["target"]
|
|
96
|
+
self.mpm_output_style_path = self.styles["professional"]["source"]
|
|
44
97
|
|
|
45
98
|
def _detect_claude_version(self) -> Optional[str]:
|
|
46
99
|
"""
|
|
@@ -58,7 +111,7 @@ class OutputStyleManager:
|
|
|
58
111
|
|
|
59
112
|
try:
|
|
60
113
|
# Run claude --version command
|
|
61
|
-
result = subprocess.run(
|
|
114
|
+
result = subprocess.run( # nosec B603 B607
|
|
62
115
|
["claude", "--version"],
|
|
63
116
|
capture_output=True,
|
|
64
117
|
text=True,
|
|
@@ -158,56 +211,77 @@ class OutputStyleManager:
|
|
|
158
211
|
"""
|
|
159
212
|
return not self.supports_output_styles()
|
|
160
213
|
|
|
161
|
-
def extract_output_style_content(
|
|
214
|
+
def extract_output_style_content(
|
|
215
|
+
self, framework_loader: Any = None, style: OutputStyleType = "professional"
|
|
216
|
+
) -> str:
|
|
162
217
|
"""
|
|
163
|
-
Read output style content from
|
|
218
|
+
Read output style content from style source file.
|
|
164
219
|
|
|
165
220
|
Args:
|
|
166
221
|
framework_loader: Optional framework loader (kept for compatibility, not used)
|
|
222
|
+
style: Style type to extract ("professional" or "teaching")
|
|
167
223
|
|
|
168
224
|
Returns:
|
|
169
225
|
Complete output style content from file
|
|
170
226
|
"""
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
227
|
+
style_config = self.styles[style]
|
|
228
|
+
source_path = style_config["source"]
|
|
229
|
+
|
|
230
|
+
if source_path.exists():
|
|
231
|
+
content = source_path.read_text()
|
|
232
|
+
self.logger.info(
|
|
233
|
+
f"Read {style} style from {source_path.name} ({len(content)} chars)"
|
|
234
|
+
)
|
|
175
235
|
return content
|
|
236
|
+
|
|
176
237
|
# Fallback error
|
|
177
|
-
error_msg = f"
|
|
238
|
+
error_msg = f"{style} style not found at {source_path}"
|
|
178
239
|
self.logger.error(error_msg)
|
|
179
240
|
raise FileNotFoundError(error_msg)
|
|
180
241
|
|
|
181
|
-
def save_output_style(
|
|
242
|
+
def save_output_style(
|
|
243
|
+
self, content: str, style: OutputStyleType = "professional"
|
|
244
|
+
) -> Path:
|
|
182
245
|
"""
|
|
183
|
-
Save output style content to
|
|
246
|
+
Save output style content to source file.
|
|
184
247
|
|
|
185
248
|
Args:
|
|
186
249
|
content: The formatted output style content
|
|
250
|
+
style: Style type to save ("professional" or "teaching")
|
|
187
251
|
|
|
188
252
|
Returns:
|
|
189
253
|
Path to the saved file
|
|
190
254
|
"""
|
|
191
255
|
try:
|
|
256
|
+
style_config = self.styles[style]
|
|
257
|
+
source_path = style_config["source"]
|
|
258
|
+
|
|
192
259
|
# Ensure the parent directory exists
|
|
193
|
-
|
|
260
|
+
source_path.parent.mkdir(parents=True, exist_ok=True)
|
|
194
261
|
|
|
195
262
|
# Write the content
|
|
196
|
-
|
|
197
|
-
self.logger.info(f"Saved
|
|
263
|
+
source_path.write_text(content, encoding="utf-8")
|
|
264
|
+
self.logger.info(f"Saved {style} style to {source_path}")
|
|
198
265
|
|
|
199
|
-
return
|
|
266
|
+
return source_path
|
|
200
267
|
except Exception as e:
|
|
201
|
-
self.logger.error(f"Failed to save
|
|
268
|
+
self.logger.error(f"Failed to save {style} style: {e}")
|
|
202
269
|
raise
|
|
203
270
|
|
|
204
|
-
def deploy_output_style(
|
|
271
|
+
def deploy_output_style(
|
|
272
|
+
self,
|
|
273
|
+
content: Optional[str] = None,
|
|
274
|
+
style: OutputStyleType = "professional",
|
|
275
|
+
activate: bool = True,
|
|
276
|
+
) -> bool:
|
|
205
277
|
"""
|
|
206
278
|
Deploy output style to Claude Code if version >= 1.0.83.
|
|
207
|
-
Deploys the style file and activates it
|
|
279
|
+
Deploys the style file and optionally activates it.
|
|
208
280
|
|
|
209
281
|
Args:
|
|
210
|
-
content: The output style content to deploy
|
|
282
|
+
content: The output style content to deploy (if None, reads from source)
|
|
283
|
+
style: Style type to deploy ("professional" or "teaching")
|
|
284
|
+
activate: Whether to activate the style after deployment
|
|
211
285
|
|
|
212
286
|
Returns:
|
|
213
287
|
True if deployed successfully, False otherwise
|
|
@@ -219,26 +293,51 @@ class OutputStyleManager:
|
|
|
219
293
|
return False
|
|
220
294
|
|
|
221
295
|
try:
|
|
222
|
-
|
|
296
|
+
style_config = self.styles[style]
|
|
297
|
+
target_path = style_config["target"]
|
|
298
|
+
style_name = style_config["name"]
|
|
299
|
+
|
|
300
|
+
# Check if this is a fresh install (file doesn't exist yet)
|
|
301
|
+
is_fresh_install = not target_path.exists()
|
|
302
|
+
|
|
303
|
+
# If content not provided, read from source
|
|
304
|
+
if content is None:
|
|
305
|
+
content = self.extract_output_style_content(style=style)
|
|
306
|
+
|
|
307
|
+
# Ensure styles directory exists
|
|
223
308
|
self.output_style_dir.mkdir(parents=True, exist_ok=True)
|
|
224
309
|
|
|
225
310
|
# Write the output style file
|
|
226
|
-
|
|
227
|
-
self.logger.info(f"Deployed
|
|
311
|
+
target_path.write_text(content, encoding="utf-8")
|
|
312
|
+
self.logger.info(f"Deployed {style} style to {target_path}")
|
|
228
313
|
|
|
229
|
-
# Activate the
|
|
230
|
-
|
|
314
|
+
# Activate the style if requested
|
|
315
|
+
if activate:
|
|
316
|
+
self._activate_output_style(
|
|
317
|
+
style_name, is_fresh_install=is_fresh_install
|
|
318
|
+
)
|
|
231
319
|
|
|
232
320
|
return True
|
|
233
321
|
|
|
234
322
|
except Exception as e:
|
|
235
|
-
self.logger.error(f"Failed to deploy
|
|
323
|
+
self.logger.error(f"Failed to deploy {style} style: {e}")
|
|
236
324
|
return False
|
|
237
325
|
|
|
238
|
-
def _activate_output_style(
|
|
326
|
+
def _activate_output_style(
|
|
327
|
+
self, style_name: str = "Claude MPM", is_fresh_install: bool = False
|
|
328
|
+
) -> bool:
|
|
239
329
|
"""
|
|
240
|
-
Update Claude Code settings to activate
|
|
241
|
-
|
|
330
|
+
Update Claude Code settings to activate a specific output style.
|
|
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
|
+
|
|
338
|
+
Args:
|
|
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)
|
|
242
341
|
|
|
243
342
|
Returns:
|
|
244
343
|
True if activated successfully, False otherwise
|
|
@@ -257,9 +356,13 @@ class OutputStyleManager:
|
|
|
257
356
|
# Check current active style
|
|
258
357
|
current_style = settings.get("activeOutputStyle")
|
|
259
358
|
|
|
260
|
-
#
|
|
261
|
-
|
|
262
|
-
|
|
359
|
+
# Only set activeOutputStyle if:
|
|
360
|
+
# 1. No active style is set (first deployment), OR
|
|
361
|
+
# 2. This is a fresh install (file didn't exist before deployment)
|
|
362
|
+
should_activate = current_style is None or is_fresh_install
|
|
363
|
+
|
|
364
|
+
if should_activate and current_style != style_name:
|
|
365
|
+
settings["activeOutputStyle"] = style_name
|
|
263
366
|
|
|
264
367
|
# Ensure settings directory exists
|
|
265
368
|
self.settings_file.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -270,10 +373,13 @@ class OutputStyleManager:
|
|
|
270
373
|
)
|
|
271
374
|
|
|
272
375
|
self.logger.info(
|
|
273
|
-
f"✅ Activated
|
|
376
|
+
f"✅ Activated {style_name} output style (was: {current_style or 'none'})"
|
|
274
377
|
)
|
|
275
378
|
else:
|
|
276
|
-
self.logger.debug(
|
|
379
|
+
self.logger.debug(
|
|
380
|
+
f"Preserving user preference: {current_style or 'none'} "
|
|
381
|
+
f"(skipping activation of {style_name})"
|
|
382
|
+
)
|
|
277
383
|
|
|
278
384
|
return True
|
|
279
385
|
|
|
@@ -319,7 +425,9 @@ class OutputStyleManager:
|
|
|
319
425
|
|
|
320
426
|
return status
|
|
321
427
|
|
|
322
|
-
def get_injectable_content(
|
|
428
|
+
def get_injectable_content(
|
|
429
|
+
self, framework_loader: Any = None, style: OutputStyleType = "professional"
|
|
430
|
+
) -> str:
|
|
323
431
|
"""
|
|
324
432
|
Get output style content for injection into instructions (for Claude < 1.0.83).
|
|
325
433
|
|
|
@@ -328,12 +436,13 @@ class OutputStyleManager:
|
|
|
328
436
|
|
|
329
437
|
Args:
|
|
330
438
|
framework_loader: Optional FrameworkLoader instance to reuse loaded content
|
|
439
|
+
style: Style type to extract ("professional" or "teaching")
|
|
331
440
|
|
|
332
441
|
Returns:
|
|
333
442
|
Simplified output style content for injection
|
|
334
443
|
"""
|
|
335
444
|
# Extract the same content but without YAML frontmatter
|
|
336
|
-
full_content = self.extract_output_style_content(framework_loader)
|
|
445
|
+
full_content = self.extract_output_style_content(framework_loader, style=style)
|
|
337
446
|
|
|
338
447
|
# Remove YAML frontmatter
|
|
339
448
|
lines = full_content.split("\n")
|
|
@@ -351,3 +460,69 @@ class OutputStyleManager:
|
|
|
351
460
|
|
|
352
461
|
# If no frontmatter found, return as-is
|
|
353
462
|
return full_content
|
|
463
|
+
|
|
464
|
+
def deploy_all_styles(self, activate_default: bool = True) -> Dict[str, bool]:
|
|
465
|
+
"""
|
|
466
|
+
Deploy all available output styles to Claude Code.
|
|
467
|
+
|
|
468
|
+
Args:
|
|
469
|
+
activate_default: Whether to activate the professional style after deployment
|
|
470
|
+
|
|
471
|
+
Returns:
|
|
472
|
+
Dictionary mapping style names to deployment success status
|
|
473
|
+
"""
|
|
474
|
+
results: Dict[str, bool] = {}
|
|
475
|
+
|
|
476
|
+
# Check if professional style exists BEFORE deployment
|
|
477
|
+
# This determines if this is a fresh install
|
|
478
|
+
professional_style_existed = self.styles["professional"]["target"].exists()
|
|
479
|
+
|
|
480
|
+
for style_type_key in self.styles:
|
|
481
|
+
# Deploy without activation
|
|
482
|
+
# Cast is safe because we know self.styles keys are OutputStyleType
|
|
483
|
+
style_type = cast("OutputStyleType", style_type_key)
|
|
484
|
+
success = self.deploy_output_style(style=style_type, activate=False)
|
|
485
|
+
results[style_type] = success
|
|
486
|
+
|
|
487
|
+
# Activate the default style if requested AND this is first deployment
|
|
488
|
+
if activate_default and results.get("professional", False):
|
|
489
|
+
self._activate_output_style(
|
|
490
|
+
"Claude MPM", is_fresh_install=not professional_style_existed
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
return results
|
|
494
|
+
|
|
495
|
+
def deploy_teaching_style(self, activate: bool = False) -> bool:
|
|
496
|
+
"""
|
|
497
|
+
Deploy the teaching style specifically.
|
|
498
|
+
|
|
499
|
+
Args:
|
|
500
|
+
activate: Whether to activate the teaching style after deployment
|
|
501
|
+
|
|
502
|
+
Returns:
|
|
503
|
+
True if deployed successfully, False otherwise
|
|
504
|
+
"""
|
|
505
|
+
return self.deploy_output_style(style="teaching", activate=activate)
|
|
506
|
+
|
|
507
|
+
def list_available_styles(self) -> Dict[str, Dict[str, str]]:
|
|
508
|
+
"""
|
|
509
|
+
List all available output styles with their metadata.
|
|
510
|
+
|
|
511
|
+
Returns:
|
|
512
|
+
Dictionary mapping style types to their configuration
|
|
513
|
+
"""
|
|
514
|
+
available_styles = {}
|
|
515
|
+
|
|
516
|
+
for style_type, config in self.styles.items():
|
|
517
|
+
source_exists = config["source"].exists()
|
|
518
|
+
target_exists = config["target"].exists()
|
|
519
|
+
|
|
520
|
+
available_styles[style_type] = {
|
|
521
|
+
"name": config["name"],
|
|
522
|
+
"source_path": str(config["source"]),
|
|
523
|
+
"target_path": str(config["target"]),
|
|
524
|
+
"source_exists": str(source_exists),
|
|
525
|
+
"deployed": str(target_exists),
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
return available_styles
|
|
@@ -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
|
|
|
@@ -55,8 +63,8 @@ class CircuitState(Enum):
|
|
|
55
63
|
class ConnectionStats:
|
|
56
64
|
"""Connection statistics for monitoring."""
|
|
57
65
|
|
|
58
|
-
created_at: datetime = field(default_factory=datetime.now)
|
|
59
|
-
last_used: datetime = field(default_factory=datetime.now)
|
|
66
|
+
created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
|
67
|
+
last_used: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
|
60
68
|
events_sent: int = 0
|
|
61
69
|
errors: int = 0
|
|
62
70
|
consecutive_errors: int = 0
|
|
@@ -70,7 +78,7 @@ class BatchEvent:
|
|
|
70
78
|
namespace: str
|
|
71
79
|
event: str
|
|
72
80
|
data: Dict[str, Any]
|
|
73
|
-
timestamp: datetime = field(default_factory=datetime.now)
|
|
81
|
+
timestamp: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
|
74
82
|
|
|
75
83
|
|
|
76
84
|
class CircuitBreaker:
|
|
@@ -309,7 +317,7 @@ class SocketIOConnectionPool:
|
|
|
309
317
|
self.server_url = f"http://localhost:{port}"
|
|
310
318
|
self.logger.debug(f"Detected Socket.IO server on port {port}")
|
|
311
319
|
return
|
|
312
|
-
except Exception:
|
|
320
|
+
except Exception: # nosec B112 - intentional: skip ports that fail
|
|
313
321
|
continue
|
|
314
322
|
|
|
315
323
|
# Fall back to default
|
|
@@ -579,7 +587,7 @@ class SocketIOConnectionPool:
|
|
|
579
587
|
loop.stop()
|
|
580
588
|
loop.run_until_complete(loop.shutdown_asyncgens())
|
|
581
589
|
loop.close()
|
|
582
|
-
except Exception:
|
|
590
|
+
except Exception: # nosec B110 - intentional: cleanup best-effort
|
|
583
591
|
pass
|
|
584
592
|
|
|
585
593
|
async def _connect_client(self, client: socketio.AsyncClient):
|
|
@@ -84,6 +84,12 @@ class AgentMetadata:
|
|
|
84
84
|
version: str = "1.0.0"
|
|
85
85
|
author: str = ""
|
|
86
86
|
tags: List[str] = None
|
|
87
|
+
# NEW: Collection-based identification fields
|
|
88
|
+
collection_id: Optional[str] = None # Format: owner/repo-name
|
|
89
|
+
source_path: Optional[str] = None # Relative path in repo
|
|
90
|
+
canonical_id: Optional[str] = (
|
|
91
|
+
None # Format: collection_id:agent_id or legacy:filename
|
|
92
|
+
)
|
|
87
93
|
|
|
88
94
|
def __post_init__(self):
|
|
89
95
|
"""Initialize default values for mutable fields."""
|
|
@@ -168,26 +174,16 @@ class UnifiedAgentRegistry:
|
|
|
168
174
|
if project_path.exists():
|
|
169
175
|
self.discovery_paths.append(project_path)
|
|
170
176
|
|
|
171
|
-
#
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
local_project_path.exists()
|
|
175
|
-
and local_project_path not in self.discovery_paths
|
|
176
|
-
):
|
|
177
|
-
self.discovery_paths.append(local_project_path)
|
|
178
|
-
logger.debug(f"Added local project templates path: {local_project_path}")
|
|
177
|
+
# NOTE: .claude-mpm/agents/ is deprecated in the simplified architecture
|
|
178
|
+
# Source agents come from ~/.claude-mpm/cache/agents/
|
|
179
|
+
# Deployed agents go to .claude/agents/
|
|
179
180
|
|
|
180
|
-
# User-level agents
|
|
181
|
+
# User-level agents (deprecated in simplified architecture)
|
|
182
|
+
# Keeping for backward compatibility but not actively used
|
|
181
183
|
user_path = self.path_manager.get_user_agents_dir()
|
|
182
184
|
if user_path.exists():
|
|
183
185
|
self.discovery_paths.append(user_path)
|
|
184
186
|
|
|
185
|
-
# Also check for user JSON templates in ~/.claude-mpm/agents/
|
|
186
|
-
local_user_path = Path.home() / ".claude-mpm" / "agents"
|
|
187
|
-
if local_user_path.exists() and local_user_path not in self.discovery_paths:
|
|
188
|
-
self.discovery_paths.append(local_user_path)
|
|
189
|
-
logger.debug(f"Added local user templates path: {local_user_path}")
|
|
190
|
-
|
|
191
187
|
# System-level agents (includes templates as a subdirectory)
|
|
192
188
|
system_path = self.path_manager.get_system_agents_dir()
|
|
193
189
|
if system_path.exists():
|
|
@@ -690,6 +686,111 @@ class UnifiedAgentRegistry:
|
|
|
690
686
|
"""Get all memory-aware agents."""
|
|
691
687
|
return self.list_agents(agent_type=AgentType.MEMORY_AWARE)
|
|
692
688
|
|
|
689
|
+
def get_agents_by_collection(self, collection_id: str) -> List[AgentMetadata]:
|
|
690
|
+
"""Get all agents from a specific collection.
|
|
691
|
+
|
|
692
|
+
NEW: Enables collection-based agent selection.
|
|
693
|
+
|
|
694
|
+
Args:
|
|
695
|
+
collection_id: Collection identifier (e.g., "bobmatnyc/claude-mpm-agents")
|
|
696
|
+
|
|
697
|
+
Returns:
|
|
698
|
+
List of agents from the specified collection
|
|
699
|
+
|
|
700
|
+
Example:
|
|
701
|
+
>>> registry = get_agent_registry()
|
|
702
|
+
>>> agents = registry.get_agents_by_collection("bobmatnyc/claude-mpm-agents")
|
|
703
|
+
>>> len(agents)
|
|
704
|
+
45
|
|
705
|
+
"""
|
|
706
|
+
if not self.registry:
|
|
707
|
+
self.discover_agents()
|
|
708
|
+
|
|
709
|
+
collection_agents = [
|
|
710
|
+
agent
|
|
711
|
+
for agent in self.registry.values()
|
|
712
|
+
if agent.collection_id == collection_id
|
|
713
|
+
]
|
|
714
|
+
|
|
715
|
+
return sorted(collection_agents, key=lambda a: a.name)
|
|
716
|
+
|
|
717
|
+
def list_collections(self) -> List[Dict[str, Any]]:
|
|
718
|
+
"""List all available collections with agent counts.
|
|
719
|
+
|
|
720
|
+
NEW: Provides overview of available collections.
|
|
721
|
+
|
|
722
|
+
Returns:
|
|
723
|
+
List of collection info dictionaries with:
|
|
724
|
+
- collection_id: Collection identifier
|
|
725
|
+
- agent_count: Number of agents in collection
|
|
726
|
+
- agents: List of agent names in collection
|
|
727
|
+
|
|
728
|
+
Example:
|
|
729
|
+
>>> registry = get_agent_registry()
|
|
730
|
+
>>> collections = registry.list_collections()
|
|
731
|
+
>>> collections
|
|
732
|
+
[
|
|
733
|
+
{
|
|
734
|
+
"collection_id": "bobmatnyc/claude-mpm-agents",
|
|
735
|
+
"agent_count": 45,
|
|
736
|
+
"agents": ["pm", "engineer", "qa", ...]
|
|
737
|
+
}
|
|
738
|
+
]
|
|
739
|
+
"""
|
|
740
|
+
if not self.registry:
|
|
741
|
+
self.discover_agents()
|
|
742
|
+
|
|
743
|
+
# Group agents by collection_id
|
|
744
|
+
collections_map: Dict[str, List[str]] = {}
|
|
745
|
+
|
|
746
|
+
for agent in self.registry.values():
|
|
747
|
+
if not agent.collection_id:
|
|
748
|
+
# Skip agents without collection (legacy or local)
|
|
749
|
+
continue
|
|
750
|
+
|
|
751
|
+
if agent.collection_id not in collections_map:
|
|
752
|
+
collections_map[agent.collection_id] = []
|
|
753
|
+
|
|
754
|
+
collections_map[agent.collection_id].append(agent.name)
|
|
755
|
+
|
|
756
|
+
# Convert to list format
|
|
757
|
+
collections = [
|
|
758
|
+
{
|
|
759
|
+
"collection_id": coll_id,
|
|
760
|
+
"agent_count": len(agent_names),
|
|
761
|
+
"agents": sorted(agent_names),
|
|
762
|
+
}
|
|
763
|
+
for coll_id, agent_names in collections_map.items()
|
|
764
|
+
]
|
|
765
|
+
|
|
766
|
+
return sorted(collections, key=lambda c: c["collection_id"])
|
|
767
|
+
|
|
768
|
+
def get_agent_by_canonical_id(self, canonical_id: str) -> Optional[AgentMetadata]:
|
|
769
|
+
"""Get agent by canonical ID (primary matching key).
|
|
770
|
+
|
|
771
|
+
NEW: Primary matching method using canonical_id.
|
|
772
|
+
|
|
773
|
+
Args:
|
|
774
|
+
canonical_id: Canonical identifier (e.g., "bobmatnyc/claude-mpm-agents:pm")
|
|
775
|
+
|
|
776
|
+
Returns:
|
|
777
|
+
AgentMetadata if found, None otherwise
|
|
778
|
+
|
|
779
|
+
Example:
|
|
780
|
+
>>> registry = get_agent_registry()
|
|
781
|
+
>>> agent = registry.get_agent_by_canonical_id("bobmatnyc/claude-mpm-agents:pm")
|
|
782
|
+
>>> agent.name
|
|
783
|
+
'Project Manager Agent'
|
|
784
|
+
"""
|
|
785
|
+
if not self.registry:
|
|
786
|
+
self.discover_agents()
|
|
787
|
+
|
|
788
|
+
for agent in self.registry.values():
|
|
789
|
+
if agent.canonical_id == canonical_id:
|
|
790
|
+
return agent
|
|
791
|
+
|
|
792
|
+
return None
|
|
793
|
+
|
|
693
794
|
def add_discovery_path(self, path: Union[str, Path]) -> None:
|
|
694
795
|
"""Add a new path for agent discovery."""
|
|
695
796
|
path = Path(path)
|
|
@@ -809,6 +910,21 @@ def get_registry_stats() -> Dict[str, Any]:
|
|
|
809
910
|
return get_agent_registry().get_registry_stats()
|
|
810
911
|
|
|
811
912
|
|
|
913
|
+
def get_agents_by_collection(collection_id: str) -> List[AgentMetadata]:
|
|
914
|
+
"""Get all agents from a specific collection."""
|
|
915
|
+
return get_agent_registry().get_agents_by_collection(collection_id)
|
|
916
|
+
|
|
917
|
+
|
|
918
|
+
def list_collections() -> List[Dict[str, Any]]:
|
|
919
|
+
"""List all available collections."""
|
|
920
|
+
return get_agent_registry().list_collections()
|
|
921
|
+
|
|
922
|
+
|
|
923
|
+
def get_agent_by_canonical_id(canonical_id: str) -> Optional[AgentMetadata]:
|
|
924
|
+
"""Get agent by canonical ID."""
|
|
925
|
+
return get_agent_registry().get_agent_by_canonical_id(canonical_id)
|
|
926
|
+
|
|
927
|
+
|
|
812
928
|
# Legacy function names for backward compatibility
|
|
813
929
|
def listAgents() -> List[str]:
|
|
814
930
|
"""Legacy function: Get list of agent names."""
|
|
@@ -838,14 +954,16 @@ __all__ = [
|
|
|
838
954
|
"discover_agents",
|
|
839
955
|
"discover_agents_sync",
|
|
840
956
|
"get_agent",
|
|
957
|
+
"get_agent_by_canonical_id",
|
|
841
958
|
"get_agent_names",
|
|
842
959
|
"get_agent_registry",
|
|
960
|
+
"get_agents_by_collection",
|
|
843
961
|
"get_core_agents",
|
|
844
962
|
"get_project_agents",
|
|
845
963
|
"get_registry_stats",
|
|
846
964
|
"get_specialized_agents",
|
|
847
|
-
# Legacy compatibility
|
|
848
965
|
"listAgents",
|
|
849
966
|
"list_agents",
|
|
850
967
|
"list_agents_all",
|
|
968
|
+
"list_collections",
|
|
851
969
|
]
|