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
|
@@ -163,10 +163,22 @@ class SkillDiscoveryService:
|
|
|
163
163
|
skill_md_files = list(self.skills_dir.rglob("SKILL.md"))
|
|
164
164
|
|
|
165
165
|
# Also find legacy *.md files in top-level directory for backward compatibility
|
|
166
|
+
# Exclude common non-skill documentation files
|
|
167
|
+
excluded_filenames = {
|
|
168
|
+
"skill.md", # Case variations of SKILL.md
|
|
169
|
+
"readme.md",
|
|
170
|
+
"claude.md",
|
|
171
|
+
"contributing.md",
|
|
172
|
+
"changelog.md",
|
|
173
|
+
"license.md",
|
|
174
|
+
"authors.md",
|
|
175
|
+
"code_of_conduct.md",
|
|
176
|
+
}
|
|
177
|
+
|
|
166
178
|
legacy_md_files = [
|
|
167
179
|
f
|
|
168
180
|
for f in self.skills_dir.glob("*.md")
|
|
169
|
-
if f.name
|
|
181
|
+
if f.name.lower() not in excluded_filenames
|
|
170
182
|
]
|
|
171
183
|
|
|
172
184
|
all_skill_files = skill_md_files + legacy_md_files
|
|
@@ -176,6 +188,15 @@ class SkillDiscoveryService:
|
|
|
176
188
|
f"and {len(legacy_md_files)} legacy .md files in {self.skills_dir}"
|
|
177
189
|
)
|
|
178
190
|
|
|
191
|
+
# Log first few file paths for debugging
|
|
192
|
+
if all_skill_files:
|
|
193
|
+
sample_files = [
|
|
194
|
+
str(f.relative_to(self.skills_dir)) for f in all_skill_files[:5]
|
|
195
|
+
]
|
|
196
|
+
self.logger.debug(f"Sample skill files: {sample_files}")
|
|
197
|
+
else:
|
|
198
|
+
self.logger.debug(f"No SKILL.md or .md files found in {self.skills_dir}")
|
|
199
|
+
|
|
179
200
|
# Track deployment names to detect collisions
|
|
180
201
|
deployment_names = {}
|
|
181
202
|
|
|
@@ -214,7 +235,14 @@ class SkillDiscoveryService:
|
|
|
214
235
|
except Exception as e:
|
|
215
236
|
self.logger.warning(f"Failed to parse skill {skill_file}: {e}")
|
|
216
237
|
|
|
217
|
-
|
|
238
|
+
# Summary logging
|
|
239
|
+
parsed_count = len(skills)
|
|
240
|
+
failed_count = len(all_skill_files) - parsed_count
|
|
241
|
+
self.logger.info(
|
|
242
|
+
f"Discovered {parsed_count} skills from {self.skills_dir.name} "
|
|
243
|
+
f"({len(all_skill_files)} files found, {failed_count} failed to parse)"
|
|
244
|
+
)
|
|
245
|
+
|
|
218
246
|
return skills
|
|
219
247
|
|
|
220
248
|
def _parse_skill_file(self, skill_file: Path) -> Optional[Dict[str, Any]]:
|
|
@@ -255,7 +283,35 @@ class SkillDiscoveryService:
|
|
|
255
283
|
try:
|
|
256
284
|
frontmatter, body = self._extract_frontmatter(content)
|
|
257
285
|
except Exception as e:
|
|
258
|
-
|
|
286
|
+
# Only log as debug for documentation files to reduce noise
|
|
287
|
+
# Common documentation files (CLAUDE.md, README.md) are expected to lack skill frontmatter
|
|
288
|
+
relative_path = (
|
|
289
|
+
skill_file.relative_to(self.skills_dir)
|
|
290
|
+
if skill_file.is_relative_to(self.skills_dir)
|
|
291
|
+
else skill_file
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
# Check if this looks like a documentation file
|
|
295
|
+
is_documentation = any(
|
|
296
|
+
doc_pattern in skill_file.name.lower()
|
|
297
|
+
for doc_pattern in [
|
|
298
|
+
"readme",
|
|
299
|
+
"claude",
|
|
300
|
+
"contributing",
|
|
301
|
+
"changelog",
|
|
302
|
+
"license",
|
|
303
|
+
]
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
if is_documentation:
|
|
307
|
+
self.logger.debug(
|
|
308
|
+
f"Skipping documentation file {relative_path} (no skill frontmatter): {e}"
|
|
309
|
+
)
|
|
310
|
+
else:
|
|
311
|
+
# For actual skill files with invalid YAML, use warning level
|
|
312
|
+
self.logger.warning(
|
|
313
|
+
f"Failed to parse skill frontmatter in {relative_path}: {e}"
|
|
314
|
+
)
|
|
259
315
|
return None
|
|
260
316
|
|
|
261
317
|
# Validate required fields
|
|
@@ -354,10 +410,24 @@ class SkillDiscoveryService:
|
|
|
354
410
|
frontmatter_text = match.group(1)
|
|
355
411
|
body = match.group(2)
|
|
356
412
|
|
|
357
|
-
# Parse YAML
|
|
413
|
+
# Parse YAML with improved error handling
|
|
358
414
|
try:
|
|
359
415
|
frontmatter = yaml.safe_load(frontmatter_text)
|
|
360
416
|
except yaml.YAMLError as e:
|
|
417
|
+
# Provide more specific error message with context
|
|
418
|
+
error_line = getattr(e, "problem_mark", None)
|
|
419
|
+
if error_line:
|
|
420
|
+
line_num = error_line.line + 1
|
|
421
|
+
col_num = error_line.column + 1
|
|
422
|
+
# Extract problematic line for context
|
|
423
|
+
lines = frontmatter_text.split("\n")
|
|
424
|
+
problem_line = (
|
|
425
|
+
lines[error_line.line] if error_line.line < len(lines) else ""
|
|
426
|
+
)
|
|
427
|
+
raise ValueError(
|
|
428
|
+
f"Invalid YAML in frontmatter at line {line_num}, column {col_num}: {e.problem}\n"
|
|
429
|
+
f" Problematic line: {problem_line.strip()}"
|
|
430
|
+
) from e
|
|
361
431
|
raise ValueError(f"Invalid YAML in frontmatter: {e}") from e
|
|
362
432
|
|
|
363
433
|
if not isinstance(frontmatter, dict):
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
"""Service for mapping skills to agents based on YAML configuration.
|
|
2
|
+
|
|
3
|
+
WHY: Progressive skills discovery requires knowing which agents need which skills.
|
|
4
|
+
This service uses a YAML configuration to map skill paths to agent IDs, enabling
|
|
5
|
+
selective skill deployment based on agent requirements.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISIONS:
|
|
8
|
+
- Load YAML configuration with skill_path -> [agent_ids] mappings
|
|
9
|
+
- Handle ALL_AGENTS marker expansion from YAML anchor
|
|
10
|
+
- Build inverse index (agent_id -> [skill_paths]) for efficient lookup
|
|
11
|
+
- Support pattern-based inference for unmatched skill paths
|
|
12
|
+
- Cache configuration to avoid repeated file I/O
|
|
13
|
+
|
|
14
|
+
YAML Configuration Format:
|
|
15
|
+
skill_mappings:
|
|
16
|
+
toolchains/python/frameworks/django:
|
|
17
|
+
- python-engineer
|
|
18
|
+
- data-engineer
|
|
19
|
+
- engineer
|
|
20
|
+
|
|
21
|
+
universal/collaboration/git-workflow: *all_agents
|
|
22
|
+
|
|
23
|
+
inference_rules:
|
|
24
|
+
language_patterns:
|
|
25
|
+
python: [python-engineer, data-engineer, engineer]
|
|
26
|
+
framework_patterns:
|
|
27
|
+
django: [python-engineer, engineer]
|
|
28
|
+
|
|
29
|
+
all_agents_list:
|
|
30
|
+
- engineer
|
|
31
|
+
- python-engineer
|
|
32
|
+
- typescript-engineer
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
References:
|
|
36
|
+
- Feature: Progressive skills discovery (#117)
|
|
37
|
+
- Research: docs/research/skill-path-to-agent-mapping-2025-12-16.md
|
|
38
|
+
- Config: src/claude_mpm/config/skill_to_agent_mapping.yaml
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
from pathlib import Path
|
|
42
|
+
from typing import Any, Dict, List, Optional, Set
|
|
43
|
+
|
|
44
|
+
import yaml
|
|
45
|
+
|
|
46
|
+
from claude_mpm.core.logging_config import get_logger
|
|
47
|
+
|
|
48
|
+
logger = get_logger(__name__)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SkillToAgentMapper:
|
|
52
|
+
"""Maps skills to agents using YAML configuration.
|
|
53
|
+
|
|
54
|
+
This service provides bidirectional mapping between skill paths and agent IDs:
|
|
55
|
+
- Forward: skill_path -> [agent_ids]
|
|
56
|
+
- Inverse: agent_id -> [skill_paths]
|
|
57
|
+
|
|
58
|
+
The service uses a YAML configuration file with explicit mappings and
|
|
59
|
+
pattern-based inference rules for skill paths not explicitly mapped.
|
|
60
|
+
|
|
61
|
+
Example:
|
|
62
|
+
>>> mapper = SkillToAgentMapper()
|
|
63
|
+
>>> agents = mapper.get_agents_for_skill('toolchains/python/frameworks/django')
|
|
64
|
+
>>> print(agents)
|
|
65
|
+
['python-engineer', 'data-engineer', 'engineer', 'api-qa']
|
|
66
|
+
|
|
67
|
+
>>> skills = mapper.get_skills_for_agent('python-engineer')
|
|
68
|
+
>>> print(f"Found {len(skills)} skills for python-engineer")
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
# Default configuration path (relative to package root)
|
|
72
|
+
DEFAULT_CONFIG_PATH = (
|
|
73
|
+
Path(__file__).parent.parent.parent / "config" / "skill_to_agent_mapping.yaml"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def __init__(self, config_path: Optional[Path] = None):
|
|
77
|
+
"""Initialize skill-to-agent mapper.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
config_path: Optional path to YAML config file.
|
|
81
|
+
If None, uses default config from package.
|
|
82
|
+
|
|
83
|
+
Raises:
|
|
84
|
+
FileNotFoundError: If config file not found
|
|
85
|
+
yaml.YAMLError: If config file is invalid YAML
|
|
86
|
+
ValueError: If config file is missing required sections
|
|
87
|
+
"""
|
|
88
|
+
self.config_path = config_path or self.DEFAULT_CONFIG_PATH
|
|
89
|
+
self.logger = get_logger(__name__)
|
|
90
|
+
|
|
91
|
+
# Load and validate configuration
|
|
92
|
+
self._config = self._load_config()
|
|
93
|
+
|
|
94
|
+
# Build forward and inverse indexes
|
|
95
|
+
self._skill_to_agents: Dict[str, List[str]] = {}
|
|
96
|
+
self._agent_to_skills: Dict[str, List[str]] = {}
|
|
97
|
+
self._build_indexes()
|
|
98
|
+
|
|
99
|
+
self.logger.info(
|
|
100
|
+
f"SkillToAgentMapper initialized: {len(self._skill_to_agents)} skill mappings, "
|
|
101
|
+
f"{len(self._agent_to_skills)} agents"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
def _load_config(self) -> Dict[str, Any]:
|
|
105
|
+
"""Load and validate YAML configuration.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
Parsed YAML configuration
|
|
109
|
+
|
|
110
|
+
Raises:
|
|
111
|
+
FileNotFoundError: If config file not found
|
|
112
|
+
yaml.YAMLError: If config file is invalid YAML
|
|
113
|
+
ValueError: If config file is missing required sections
|
|
114
|
+
"""
|
|
115
|
+
if not self.config_path.exists():
|
|
116
|
+
raise FileNotFoundError(f"Configuration file not found: {self.config_path}")
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
with open(self.config_path, encoding="utf-8") as f:
|
|
120
|
+
config = yaml.safe_load(f)
|
|
121
|
+
except yaml.YAMLError as e:
|
|
122
|
+
raise yaml.YAMLError(f"Invalid YAML in {self.config_path}: {e}") from e
|
|
123
|
+
|
|
124
|
+
# Validate required sections
|
|
125
|
+
if not isinstance(config, dict):
|
|
126
|
+
raise ValueError("Configuration must be a YAML dictionary")
|
|
127
|
+
|
|
128
|
+
if "skill_mappings" not in config:
|
|
129
|
+
raise ValueError("Configuration missing required section: skill_mappings")
|
|
130
|
+
|
|
131
|
+
if "all_agents_list" not in config:
|
|
132
|
+
raise ValueError("Configuration missing required section: all_agents_list")
|
|
133
|
+
|
|
134
|
+
self.logger.debug(f"Loaded configuration from {self.config_path}")
|
|
135
|
+
return config
|
|
136
|
+
|
|
137
|
+
def _build_indexes(self) -> None:
|
|
138
|
+
"""Build forward and inverse mapping indexes.
|
|
139
|
+
|
|
140
|
+
Processes skill_mappings from config and expands ALL_AGENTS markers.
|
|
141
|
+
Builds bidirectional indexes for efficient lookup.
|
|
142
|
+
|
|
143
|
+
Index Structure:
|
|
144
|
+
_skill_to_agents: {"skill/path": ["agent1", "agent2", ...]}
|
|
145
|
+
_agent_to_skills: {"agent1": ["skill/path1", "skill/path2", ...]}
|
|
146
|
+
"""
|
|
147
|
+
skill_mappings = self._config["skill_mappings"]
|
|
148
|
+
all_agents = self._config["all_agents_list"]
|
|
149
|
+
|
|
150
|
+
for skill_path, agent_list in skill_mappings.items():
|
|
151
|
+
# Handle ALL_AGENTS marker expansion
|
|
152
|
+
if (
|
|
153
|
+
isinstance(agent_list, list)
|
|
154
|
+
and len(agent_list) == 1
|
|
155
|
+
and agent_list[0] == "ALL_AGENTS"
|
|
156
|
+
):
|
|
157
|
+
expanded_agents = all_agents.copy()
|
|
158
|
+
self.logger.debug(
|
|
159
|
+
f"Expanded ALL_AGENTS for {skill_path}: {len(expanded_agents)} agents"
|
|
160
|
+
)
|
|
161
|
+
else:
|
|
162
|
+
expanded_agents = agent_list
|
|
163
|
+
|
|
164
|
+
# Ensure agent_list is actually a list
|
|
165
|
+
if not isinstance(expanded_agents, list):
|
|
166
|
+
self.logger.warning(
|
|
167
|
+
f"Invalid agent list for {skill_path}: {type(expanded_agents)}. Skipping."
|
|
168
|
+
)
|
|
169
|
+
continue
|
|
170
|
+
|
|
171
|
+
# Build forward index: skill -> agents
|
|
172
|
+
self._skill_to_agents[skill_path] = expanded_agents
|
|
173
|
+
|
|
174
|
+
# Build inverse index: agent -> skills
|
|
175
|
+
for agent_id in expanded_agents:
|
|
176
|
+
if agent_id not in self._agent_to_skills:
|
|
177
|
+
self._agent_to_skills[agent_id] = []
|
|
178
|
+
self._agent_to_skills[agent_id].append(skill_path)
|
|
179
|
+
|
|
180
|
+
self.logger.debug(
|
|
181
|
+
f"Built indexes: {len(self._skill_to_agents)} skills, {len(self._agent_to_skills)} agents"
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
def get_agents_for_skill(self, skill_path: str) -> List[str]:
|
|
185
|
+
"""Get list of agent IDs for a skill path.
|
|
186
|
+
|
|
187
|
+
Looks up skill path in configuration. If not found, attempts to infer
|
|
188
|
+
agents using pattern-based rules.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
skill_path: Skill path (e.g., "toolchains/python/frameworks/django")
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
List of agent IDs that should receive this skill.
|
|
195
|
+
Empty list if no mapping found and inference fails.
|
|
196
|
+
|
|
197
|
+
Example:
|
|
198
|
+
>>> agents = mapper.get_agents_for_skill('toolchains/python/frameworks/django')
|
|
199
|
+
>>> print(agents)
|
|
200
|
+
['python-engineer', 'data-engineer', 'engineer', 'api-qa']
|
|
201
|
+
|
|
202
|
+
>>> # Fallback to inference
|
|
203
|
+
>>> agents = mapper.get_agents_for_skill('toolchains/python/new-framework')
|
|
204
|
+
>>> print(agents)
|
|
205
|
+
['python-engineer', 'data-engineer', 'engineer']
|
|
206
|
+
"""
|
|
207
|
+
# Try exact match first
|
|
208
|
+
if skill_path in self._skill_to_agents:
|
|
209
|
+
return self._skill_to_agents[skill_path].copy()
|
|
210
|
+
|
|
211
|
+
# Fallback to pattern-based inference
|
|
212
|
+
inferred_agents = self.infer_agents_from_pattern(skill_path)
|
|
213
|
+
if inferred_agents:
|
|
214
|
+
self.logger.debug(
|
|
215
|
+
f"Inferred {len(inferred_agents)} agents for unmapped skill: {skill_path}"
|
|
216
|
+
)
|
|
217
|
+
return inferred_agents
|
|
218
|
+
|
|
219
|
+
# No mapping or inference available
|
|
220
|
+
self.logger.debug(f"No mapping or inference available for skill: {skill_path}")
|
|
221
|
+
return []
|
|
222
|
+
|
|
223
|
+
def get_skills_for_agent(self, agent_id: str) -> List[str]:
|
|
224
|
+
"""Get list of skill paths for an agent (inverse lookup).
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
agent_id: Agent identifier (e.g., "python-engineer")
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
List of skill paths assigned to this agent.
|
|
231
|
+
Empty list if agent not found in configuration.
|
|
232
|
+
|
|
233
|
+
Example:
|
|
234
|
+
>>> skills = mapper.get_skills_for_agent('python-engineer')
|
|
235
|
+
>>> print(f"Found {len(skills)} skills")
|
|
236
|
+
>>> for skill in skills[:5]:
|
|
237
|
+
... print(f" - {skill}")
|
|
238
|
+
"""
|
|
239
|
+
if agent_id not in self._agent_to_skills:
|
|
240
|
+
self.logger.debug(f"No skills found for agent: {agent_id}")
|
|
241
|
+
return []
|
|
242
|
+
|
|
243
|
+
return self._agent_to_skills[agent_id].copy()
|
|
244
|
+
|
|
245
|
+
def infer_agents_from_pattern(self, skill_path: str) -> List[str]:
|
|
246
|
+
"""Infer agents for a skill path using pattern matching.
|
|
247
|
+
|
|
248
|
+
Uses inference_rules from configuration to match skill paths against
|
|
249
|
+
language, framework, and domain patterns.
|
|
250
|
+
|
|
251
|
+
Pattern Matching Algorithm:
|
|
252
|
+
1. Extract path components (language, framework, domain)
|
|
253
|
+
2. Match against language_patterns (e.g., "python" -> python-engineer)
|
|
254
|
+
3. Match against framework_patterns (e.g., "django" -> django agents)
|
|
255
|
+
4. Match against domain_patterns (e.g., "testing" -> qa agents)
|
|
256
|
+
5. Combine and deduplicate results
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
skill_path: Skill path to infer agents for
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
List of inferred agent IDs, or empty list if no patterns match
|
|
263
|
+
|
|
264
|
+
Example:
|
|
265
|
+
>>> # Infer from language pattern
|
|
266
|
+
>>> agents = mapper.infer_agents_from_pattern('toolchains/python/new-lib')
|
|
267
|
+
>>> 'python-engineer' in agents
|
|
268
|
+
True
|
|
269
|
+
|
|
270
|
+
>>> # Infer from framework pattern
|
|
271
|
+
>>> agents = mapper.infer_agents_from_pattern('toolchains/typescript/frameworks/nextjs-advanced')
|
|
272
|
+
>>> 'nextjs-engineer' in agents
|
|
273
|
+
True
|
|
274
|
+
"""
|
|
275
|
+
if "inference_rules" not in self._config:
|
|
276
|
+
return []
|
|
277
|
+
|
|
278
|
+
inference_rules = self._config["inference_rules"]
|
|
279
|
+
inferred_agents: Set[str] = set()
|
|
280
|
+
|
|
281
|
+
# Normalize skill path for matching (lowercase, split on /)
|
|
282
|
+
path_parts = skill_path.lower().split("/")
|
|
283
|
+
|
|
284
|
+
# Match language patterns
|
|
285
|
+
if "language_patterns" in inference_rules:
|
|
286
|
+
for language, agents in inference_rules["language_patterns"].items():
|
|
287
|
+
if language in path_parts:
|
|
288
|
+
inferred_agents.update(agents)
|
|
289
|
+
self.logger.debug(
|
|
290
|
+
f"Matched language pattern '{language}' in {skill_path}"
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
# Match framework patterns
|
|
294
|
+
if "framework_patterns" in inference_rules:
|
|
295
|
+
for framework, agents in inference_rules["framework_patterns"].items():
|
|
296
|
+
# Match framework name anywhere in path (e.g., "nextjs" in path)
|
|
297
|
+
if any(framework in part for part in path_parts):
|
|
298
|
+
inferred_agents.update(agents)
|
|
299
|
+
self.logger.debug(
|
|
300
|
+
f"Matched framework pattern '{framework}' in {skill_path}"
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
# Match domain patterns
|
|
304
|
+
if "domain_patterns" in inference_rules:
|
|
305
|
+
for domain, agents in inference_rules["domain_patterns"].items():
|
|
306
|
+
if domain in path_parts:
|
|
307
|
+
inferred_agents.update(agents)
|
|
308
|
+
self.logger.debug(
|
|
309
|
+
f"Matched domain pattern '{domain}' in {skill_path}"
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
return sorted(inferred_agents)
|
|
313
|
+
|
|
314
|
+
def get_all_mapped_skills(self) -> List[str]:
|
|
315
|
+
"""Get all skill paths with explicit mappings.
|
|
316
|
+
|
|
317
|
+
Returns:
|
|
318
|
+
List of all skill paths in configuration (sorted)
|
|
319
|
+
|
|
320
|
+
Example:
|
|
321
|
+
>>> skills = mapper.get_all_mapped_skills()
|
|
322
|
+
>>> print(f"Total mapped skills: {len(skills)}")
|
|
323
|
+
"""
|
|
324
|
+
return sorted(self._skill_to_agents.keys())
|
|
325
|
+
|
|
326
|
+
def get_all_agents(self) -> List[str]:
|
|
327
|
+
"""Get all agent IDs referenced in mappings.
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
List of all agent IDs in configuration (sorted)
|
|
331
|
+
|
|
332
|
+
Example:
|
|
333
|
+
>>> agents = mapper.get_all_agents()
|
|
334
|
+
>>> print(f"Total agents: {len(agents)}")
|
|
335
|
+
"""
|
|
336
|
+
return sorted(self._agent_to_skills.keys())
|
|
337
|
+
|
|
338
|
+
def is_skill_mapped(self, skill_path: str) -> bool:
|
|
339
|
+
"""Check if skill path has an explicit mapping.
|
|
340
|
+
|
|
341
|
+
Args:
|
|
342
|
+
skill_path: Skill path to check
|
|
343
|
+
|
|
344
|
+
Returns:
|
|
345
|
+
True if skill has explicit mapping, False otherwise
|
|
346
|
+
|
|
347
|
+
Example:
|
|
348
|
+
>>> mapper.is_skill_mapped('toolchains/python/frameworks/django')
|
|
349
|
+
True
|
|
350
|
+
>>> mapper.is_skill_mapped('toolchains/python/unknown')
|
|
351
|
+
False
|
|
352
|
+
"""
|
|
353
|
+
return skill_path in self._skill_to_agents
|
|
354
|
+
|
|
355
|
+
def get_mapping_stats(self) -> Dict[str, Any]:
|
|
356
|
+
"""Get statistics about skill-to-agent mappings.
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
Dictionary with mapping statistics:
|
|
360
|
+
{
|
|
361
|
+
"total_skills": int,
|
|
362
|
+
"total_agents": int,
|
|
363
|
+
"avg_agents_per_skill": float,
|
|
364
|
+
"avg_skills_per_agent": float,
|
|
365
|
+
"config_path": str,
|
|
366
|
+
"config_version": str
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
Example:
|
|
370
|
+
>>> stats = mapper.get_mapping_stats()
|
|
371
|
+
>>> print(f"Total skills: {stats['total_skills']}")
|
|
372
|
+
>>> print(f"Total agents: {stats['total_agents']}")
|
|
373
|
+
"""
|
|
374
|
+
total_skills = len(self._skill_to_agents)
|
|
375
|
+
total_agents = len(self._agent_to_skills)
|
|
376
|
+
|
|
377
|
+
# Calculate averages
|
|
378
|
+
avg_agents_per_skill = (
|
|
379
|
+
sum(len(agents) for agents in self._skill_to_agents.values()) / total_skills
|
|
380
|
+
if total_skills > 0
|
|
381
|
+
else 0.0
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
avg_skills_per_agent = (
|
|
385
|
+
sum(len(skills) for skills in self._agent_to_skills.values()) / total_agents
|
|
386
|
+
if total_agents > 0
|
|
387
|
+
else 0.0
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
return {
|
|
391
|
+
"total_skills": total_skills,
|
|
392
|
+
"total_agents": total_agents,
|
|
393
|
+
"avg_agents_per_skill": round(avg_agents_per_skill, 2),
|
|
394
|
+
"avg_skills_per_agent": round(avg_skills_per_agent, 2),
|
|
395
|
+
"config_path": str(self.config_path),
|
|
396
|
+
"config_version": self._config.get("metadata", {}).get(
|
|
397
|
+
"version", "unknown"
|
|
398
|
+
),
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
def __repr__(self) -> str:
|
|
402
|
+
"""Return string representation."""
|
|
403
|
+
return (
|
|
404
|
+
f"SkillToAgentMapper(skills={len(self._skill_to_agents)}, "
|
|
405
|
+
f"agents={len(self._agent_to_skills)})"
|
|
406
|
+
)
|