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
|
@@ -18,7 +18,7 @@ ARCHITECTURE:
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
import os
|
|
21
|
-
import subprocess
|
|
21
|
+
import subprocess # nosec B404
|
|
22
22
|
from typing import Optional
|
|
23
23
|
|
|
24
24
|
from rich.console import Console
|
|
@@ -84,6 +84,7 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
84
84
|
SkillsCommands.INFO.value: self._show_skill_info,
|
|
85
85
|
SkillsCommands.CONFIG.value: self._manage_config,
|
|
86
86
|
SkillsCommands.CONFIGURE.value: self._configure_skills,
|
|
87
|
+
SkillsCommands.SELECT.value: self._select_skills_interactive,
|
|
87
88
|
# GitHub deployment commands
|
|
88
89
|
SkillsCommands.DEPLOY_FROM_GITHUB.value: self._deploy_from_github,
|
|
89
90
|
SkillsCommands.LIST_AVAILABLE.value: self._list_available_github_skills,
|
|
@@ -504,7 +505,7 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
504
505
|
# Open in editor
|
|
505
506
|
editor = os.environ.get("EDITOR", "nano")
|
|
506
507
|
try:
|
|
507
|
-
subprocess.run([editor, str(config_path)], check=True)
|
|
508
|
+
subprocess.run([editor, str(config_path)], check=True) # nosec B603
|
|
508
509
|
console.print(
|
|
509
510
|
f"\n[green]Configuration saved to {config_path}[/green]\n"
|
|
510
511
|
)
|
|
@@ -537,7 +538,7 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
537
538
|
toolchain = getattr(args, "toolchain", None)
|
|
538
539
|
categories = getattr(args, "categories", None)
|
|
539
540
|
force = getattr(args, "force", False)
|
|
540
|
-
|
|
541
|
+
deploy_all = getattr(args, "all", False)
|
|
541
542
|
|
|
542
543
|
if collection:
|
|
543
544
|
console.print(
|
|
@@ -548,23 +549,30 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
548
549
|
"\n[bold cyan]Deploying skills from default collection...[/bold cyan]\n"
|
|
549
550
|
)
|
|
550
551
|
|
|
551
|
-
#
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
"[yellow]No toolchain specified. Use --toolchain to filter by language,[/yellow]"
|
|
555
|
-
)
|
|
556
|
-
console.print(
|
|
557
|
-
"[yellow]or --all to deploy all available skills.[/yellow]\n"
|
|
558
|
-
)
|
|
559
|
-
|
|
552
|
+
# Use selective deployment unless --all flag is provided
|
|
553
|
+
# Selective mode deploys only agent-referenced skills
|
|
554
|
+
# --all mode deploys all available skills from the collection
|
|
560
555
|
result = self.skills_deployer.deploy_skills(
|
|
561
556
|
collection=collection,
|
|
562
557
|
toolchain=toolchain,
|
|
563
558
|
categories=categories,
|
|
564
559
|
force=force,
|
|
560
|
+
selective=not deploy_all,
|
|
565
561
|
)
|
|
566
562
|
|
|
567
563
|
# Display results
|
|
564
|
+
# Show selective mode summary
|
|
565
|
+
if result.get("selective_mode"):
|
|
566
|
+
total_available = result.get("total_available", 0)
|
|
567
|
+
deployed_count = result["deployed_count"]
|
|
568
|
+
console.print(
|
|
569
|
+
f"[cyan]📌 Selective deployment: {deployed_count} agent-referenced skills "
|
|
570
|
+
f"(out of {total_available} available)[/cyan]"
|
|
571
|
+
)
|
|
572
|
+
console.print(
|
|
573
|
+
"[dim]Use 'claude-mpm skills configure' to manually select skills[/dim]\n"
|
|
574
|
+
)
|
|
575
|
+
|
|
568
576
|
if result["deployed_count"] > 0:
|
|
569
577
|
console.print(
|
|
570
578
|
f"[green]✓ Deployed {result['deployed_count']} skill(s):[/green]"
|
|
@@ -587,6 +595,16 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
587
595
|
console.print(f" • {error}")
|
|
588
596
|
console.print()
|
|
589
597
|
|
|
598
|
+
# Show cleanup results
|
|
599
|
+
cleanup = result.get("cleanup", {})
|
|
600
|
+
if cleanup.get("removed_count", 0) > 0:
|
|
601
|
+
console.print(
|
|
602
|
+
f"[yellow]🧹 Removed {cleanup['removed_count']} orphaned skill(s):[/yellow]"
|
|
603
|
+
)
|
|
604
|
+
for skill in cleanup.get("removed_skills", []):
|
|
605
|
+
console.print(f" • {skill}")
|
|
606
|
+
console.print()
|
|
607
|
+
|
|
590
608
|
# Show restart instructions
|
|
591
609
|
if result["restart_instructions"]:
|
|
592
610
|
console.print(
|
|
@@ -658,33 +676,91 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
658
676
|
def _check_deployed_skills(self, args) -> CommandResult:
|
|
659
677
|
"""Check currently deployed skills in ~/.claude/skills/."""
|
|
660
678
|
try:
|
|
661
|
-
|
|
679
|
+
# Get deployed skills
|
|
680
|
+
deployed_result = self.skills_deployer.check_deployed_skills()
|
|
681
|
+
deployed_names = {skill["name"] for skill in deployed_result["skills"]}
|
|
662
682
|
|
|
663
683
|
console.print("\n[bold cyan]Claude Code Skills Status:[/bold cyan]\n")
|
|
664
|
-
console.print(
|
|
684
|
+
console.print(
|
|
685
|
+
f"[dim]Directory: {deployed_result['claude_skills_dir']}[/dim]\n"
|
|
686
|
+
)
|
|
687
|
+
|
|
688
|
+
# Fetch available skills from GitHub to get full list
|
|
689
|
+
try:
|
|
690
|
+
available_result = self.skills_deployer.list_available_skills()
|
|
691
|
+
all_skills = available_result.get("skills", [])
|
|
692
|
+
except Exception as e:
|
|
693
|
+
console.print(
|
|
694
|
+
f"[yellow]Warning: Could not fetch available skills: {e}[/yellow]\n"
|
|
695
|
+
)
|
|
696
|
+
all_skills = []
|
|
697
|
+
|
|
698
|
+
# Combine deployed and available skills
|
|
699
|
+
skill_map = {}
|
|
700
|
+
|
|
701
|
+
# Add available skills
|
|
702
|
+
for skill in all_skills:
|
|
703
|
+
skill_name = skill.get("name", "")
|
|
704
|
+
if skill_name:
|
|
705
|
+
skill_map[skill_name] = {
|
|
706
|
+
"name": skill.get("display_name")
|
|
707
|
+
or skill_name.replace("-", " ").title(),
|
|
708
|
+
"skill_id": skill_name,
|
|
709
|
+
"source": "MPM Skills",
|
|
710
|
+
"is_deployed": skill_name in deployed_names,
|
|
711
|
+
}
|
|
665
712
|
|
|
666
|
-
|
|
667
|
-
|
|
713
|
+
# Add any deployed skills not in available list (local/custom skills)
|
|
714
|
+
for skill in deployed_result["skills"]:
|
|
715
|
+
skill_name = skill["name"]
|
|
716
|
+
if skill_name not in skill_map:
|
|
717
|
+
skill_map[skill_name] = {
|
|
718
|
+
"name": skill_name.replace("-", " ").title(),
|
|
719
|
+
"skill_id": skill_name,
|
|
720
|
+
"source": "Local",
|
|
721
|
+
"is_deployed": True,
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
if not skill_map:
|
|
725
|
+
console.print("[yellow]No skills available.[/yellow]")
|
|
668
726
|
console.print(
|
|
669
727
|
"[dim]Use 'claude-mpm skills deploy-github' to deploy skills.[/dim]\n"
|
|
670
728
|
)
|
|
671
729
|
return CommandResult(success=True, exit_code=0)
|
|
672
730
|
|
|
673
|
-
|
|
674
|
-
|
|
731
|
+
# Create table matching agent management format
|
|
732
|
+
table = Table(show_header=True, header_style="bold cyan")
|
|
733
|
+
table.add_column("#", style="bright_black", width=6, no_wrap=True)
|
|
734
|
+
table.add_column(
|
|
735
|
+
"Skill ID", style="bright_black", no_wrap=True, overflow="ellipsis"
|
|
675
736
|
)
|
|
737
|
+
table.add_column(
|
|
738
|
+
"Name", style="bright_cyan", no_wrap=True, overflow="ellipsis"
|
|
739
|
+
)
|
|
740
|
+
table.add_column("Source", style="bright_yellow", no_wrap=True)
|
|
741
|
+
table.add_column("Status", style="bright_black", no_wrap=True)
|
|
676
742
|
|
|
677
|
-
#
|
|
678
|
-
|
|
679
|
-
table.add_column("Skill Name", style="green")
|
|
680
|
-
table.add_column("Path", style="dim")
|
|
743
|
+
# Sort skills by name for consistent display
|
|
744
|
+
sorted_skills = sorted(skill_map.values(), key=lambda s: s["skill_id"])
|
|
681
745
|
|
|
682
|
-
for skill in
|
|
683
|
-
|
|
746
|
+
for idx, skill in enumerate(sorted_skills, 1):
|
|
747
|
+
status = (
|
|
748
|
+
"[green]Installed[/green]" if skill["is_deployed"] else "Available"
|
|
749
|
+
)
|
|
750
|
+
table.add_row(
|
|
751
|
+
str(idx), skill["skill_id"], skill["name"], skill["source"], status
|
|
752
|
+
)
|
|
684
753
|
|
|
685
754
|
console.print(table)
|
|
686
755
|
console.print()
|
|
687
756
|
|
|
757
|
+
# Show summary
|
|
758
|
+
deployed_count = sum(1 for s in skill_map.values() if s["is_deployed"])
|
|
759
|
+
console.print(
|
|
760
|
+
f"[dim]Showing {len(skill_map)} skills ({deployed_count} installed, "
|
|
761
|
+
f"{len(skill_map) - deployed_count} available)[/dim]\n"
|
|
762
|
+
)
|
|
763
|
+
|
|
688
764
|
return CommandResult(success=True, exit_code=0)
|
|
689
765
|
|
|
690
766
|
except Exception as e:
|
|
@@ -953,23 +1029,37 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
953
1029
|
console.print(f"[red]Unexpected error: {e}[/red]")
|
|
954
1030
|
|
|
955
1031
|
def _configure_skills(self, args) -> CommandResult:
|
|
956
|
-
"""Interactive skills configuration
|
|
1032
|
+
"""Interactive skills configuration using configuration.yaml.
|
|
957
1033
|
|
|
958
1034
|
Provides checkbox-based selection interface matching agents configure UX:
|
|
959
|
-
-
|
|
960
|
-
-
|
|
961
|
-
-
|
|
962
|
-
-
|
|
963
|
-
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
1035
|
+
- Shows current mode (user_defined vs agent_referenced)
|
|
1036
|
+
- If agent mode: shows agent-scanned skills
|
|
1037
|
+
- Allows switching to user_defined mode and selecting skills
|
|
1038
|
+
- Can reset to agent mode (clears user_defined)
|
|
1039
|
+
- Saves selections to configuration.yaml
|
|
1040
|
+
|
|
1041
|
+
Configuration structure:
|
|
1042
|
+
```yaml
|
|
1043
|
+
skills:
|
|
1044
|
+
agent_referenced: # Auto-populated from agent scan (read-only)
|
|
1045
|
+
- systematic-debugging
|
|
1046
|
+
- typescript-core
|
|
1047
|
+
user_defined: # User override - if set, ONLY these are deployed
|
|
1048
|
+
[] # Empty = use agent_referenced
|
|
1049
|
+
```
|
|
967
1050
|
"""
|
|
968
1051
|
try:
|
|
1052
|
+
from pathlib import Path
|
|
1053
|
+
|
|
969
1054
|
import questionary
|
|
1055
|
+
import yaml
|
|
970
1056
|
from questionary import Choice, Style
|
|
971
1057
|
from rich.prompt import Prompt
|
|
972
1058
|
|
|
1059
|
+
from ...services.skills.selective_skill_deployer import (
|
|
1060
|
+
get_skills_to_deploy,
|
|
1061
|
+
)
|
|
1062
|
+
|
|
973
1063
|
# Questionary style (matching agents configure)
|
|
974
1064
|
QUESTIONARY_STYLE = Style(
|
|
975
1065
|
[
|
|
@@ -994,213 +1084,298 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
994
1084
|
]
|
|
995
1085
|
)
|
|
996
1086
|
|
|
997
|
-
console.print("\n[bold cyan]
|
|
1087
|
+
console.print("\n[bold cyan]Skills Configuration Manager[/bold cyan]\n")
|
|
1088
|
+
|
|
1089
|
+
# Load current configuration
|
|
1090
|
+
project_config_path = Path.cwd() / ".claude-mpm" / "configuration.yaml"
|
|
1091
|
+
skills_to_deploy, current_mode = get_skills_to_deploy(project_config_path)
|
|
1092
|
+
|
|
1093
|
+
# Display current mode and skill count
|
|
1094
|
+
console.print(f"[bold]Current Mode:[/bold] [cyan]{current_mode}[/cyan]")
|
|
998
1095
|
console.print(
|
|
999
|
-
"[
|
|
1096
|
+
f"[bold]Active Skills:[/bold] {len(skills_to_deploy)} skills\n"
|
|
1000
1097
|
)
|
|
1001
|
-
console.print("[dim]● = Installed, ○ = Available[/dim]\n")
|
|
1002
1098
|
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1099
|
+
if current_mode == "agent_referenced":
|
|
1100
|
+
console.print(
|
|
1101
|
+
"[dim]Agent mode: Skills are auto-detected from deployed agents[/dim]"
|
|
1102
|
+
)
|
|
1103
|
+
console.print(
|
|
1104
|
+
"[dim]Switch to user mode to manually select skills[/dim]\n"
|
|
1105
|
+
)
|
|
1106
|
+
else:
|
|
1107
|
+
console.print(
|
|
1108
|
+
"[dim]User mode: You've manually selected which skills to deploy[/dim]"
|
|
1109
|
+
)
|
|
1110
|
+
console.print("[dim]Reset to agent mode to use auto-detection[/dim]\n")
|
|
1111
|
+
|
|
1112
|
+
# Offer mode switching
|
|
1113
|
+
action_choices = [
|
|
1114
|
+
Choice("View current skills", value="view"),
|
|
1115
|
+
Choice("Switch to user mode (manual selection)", value="switch_user"),
|
|
1116
|
+
Choice("Reset to agent mode (auto-detection)", value="reset_agent"),
|
|
1117
|
+
Choice("Cancel", value="cancel"),
|
|
1118
|
+
]
|
|
1119
|
+
|
|
1120
|
+
action = questionary.select(
|
|
1121
|
+
"What would you like to do?",
|
|
1122
|
+
choices=action_choices,
|
|
1123
|
+
style=QUESTIONARY_STYLE,
|
|
1124
|
+
).ask()
|
|
1125
|
+
|
|
1126
|
+
if action == "cancel" or action is None:
|
|
1127
|
+
console.print("[yellow]Configuration cancelled[/yellow]")
|
|
1128
|
+
return CommandResult(success=True, exit_code=0)
|
|
1008
1129
|
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1130
|
+
if action == "view":
|
|
1131
|
+
# Display current skills
|
|
1132
|
+
console.print("\n[bold]Current Skills:[/bold]\n")
|
|
1133
|
+
for skill in sorted(skills_to_deploy):
|
|
1134
|
+
console.print(f" • {skill}")
|
|
1135
|
+
console.print()
|
|
1136
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1137
|
+
return CommandResult(success=True, exit_code=0)
|
|
1012
1138
|
|
|
1013
|
-
if
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1139
|
+
if action == "reset_agent":
|
|
1140
|
+
# Reset to agent mode by clearing user_defined
|
|
1141
|
+
with open(project_config_path, encoding="utf-8") as f:
|
|
1142
|
+
config = yaml.safe_load(f) or {}
|
|
1143
|
+
|
|
1144
|
+
if "skills" not in config:
|
|
1145
|
+
config["skills"] = {}
|
|
1146
|
+
|
|
1147
|
+
config["skills"]["user_defined"] = []
|
|
1148
|
+
|
|
1149
|
+
with open(project_config_path, "w", encoding="utf-8") as f:
|
|
1150
|
+
yaml.dump(config, f, default_flow_style=False, sort_keys=False)
|
|
1151
|
+
|
|
1152
|
+
console.print(
|
|
1153
|
+
"\n[green]✓ Reset to agent mode - skills will be auto-detected from agents[/green]\n"
|
|
1017
1154
|
)
|
|
1155
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1156
|
+
return CommandResult(success=True, exit_code=0)
|
|
1018
1157
|
|
|
1019
|
-
#
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
"category": category,
|
|
1026
|
-
"is_deployed": skill.get("name", "unknown") in deployed_skills,
|
|
1027
|
-
}
|
|
1028
|
-
all_skills.append(skill_info)
|
|
1158
|
+
# Switch to user mode - manual skill selection
|
|
1159
|
+
if action == "switch_user":
|
|
1160
|
+
console.print(
|
|
1161
|
+
"\n[bold cyan]Switching to User Mode - Manual Skill Selection[/bold cyan]\n"
|
|
1162
|
+
)
|
|
1163
|
+
console.print("[dim]Fetching available skills from GitHub...[/dim]\n")
|
|
1029
1164
|
|
|
1030
|
-
|
|
1031
|
-
|
|
1165
|
+
# Get available skills
|
|
1166
|
+
available_result = self.skills_deployer.list_available_skills()
|
|
1032
1167
|
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1168
|
+
if available_result.get("error"):
|
|
1169
|
+
console.print(f"[red]Error: {available_result['error']}[/red]")
|
|
1170
|
+
return CommandResult(
|
|
1171
|
+
success=False, message=available_result["error"], exit_code=1
|
|
1172
|
+
)
|
|
1038
1173
|
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1174
|
+
# Flatten skills by category
|
|
1175
|
+
all_skills = []
|
|
1176
|
+
for category, skills in available_result.get("by_category", {}).items():
|
|
1177
|
+
for skill in skills:
|
|
1178
|
+
skill_name = skill.get("name", "unknown")
|
|
1179
|
+
is_currently_selected = skill_name in skills_to_deploy
|
|
1180
|
+
skill_info = {
|
|
1181
|
+
"name": skill_name,
|
|
1182
|
+
"category": category,
|
|
1183
|
+
"is_selected": is_currently_selected,
|
|
1184
|
+
}
|
|
1185
|
+
all_skills.append(skill_info)
|
|
1186
|
+
|
|
1187
|
+
# Sort by selection status (selected first), then by name
|
|
1188
|
+
all_skills.sort(key=lambda s: (not s["is_selected"], s["name"]))
|
|
1189
|
+
|
|
1190
|
+
# Build checkbox choices
|
|
1191
|
+
while True:
|
|
1192
|
+
skill_choices = []
|
|
1193
|
+
|
|
1194
|
+
for skill in all_skills:
|
|
1195
|
+
skill_name = skill["name"]
|
|
1196
|
+
category = skill["category"]
|
|
1197
|
+
is_selected = skill["is_selected"]
|
|
1198
|
+
|
|
1199
|
+
# Format: "skill-name (category)"
|
|
1200
|
+
choice_text = f"{skill_name} ({category})"
|
|
1201
|
+
|
|
1202
|
+
# Pre-select if currently in skills_to_deploy
|
|
1203
|
+
choice = Choice(
|
|
1204
|
+
title=choice_text, value=skill_name, checked=is_selected
|
|
1205
|
+
)
|
|
1043
1206
|
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1207
|
+
skill_choices.append(choice)
|
|
1208
|
+
|
|
1209
|
+
# Display checkbox selection
|
|
1210
|
+
selected_skills = questionary.checkbox(
|
|
1211
|
+
"Select skills (Space to toggle, Enter to confirm):",
|
|
1212
|
+
choices=skill_choices,
|
|
1213
|
+
style=QUESTIONARY_STYLE,
|
|
1214
|
+
).ask()
|
|
1215
|
+
|
|
1216
|
+
if selected_skills is None:
|
|
1217
|
+
# User cancelled (Ctrl+C)
|
|
1218
|
+
console.print("[yellow]Skills configuration cancelled[/yellow]")
|
|
1219
|
+
return CommandResult(success=True, exit_code=0)
|
|
1220
|
+
|
|
1221
|
+
# Show summary
|
|
1222
|
+
console.print("\n[bold]Selected Skills:[/bold]")
|
|
1223
|
+
console.print(f" {len(selected_skills)} skills selected\n")
|
|
1224
|
+
|
|
1225
|
+
if selected_skills:
|
|
1226
|
+
for skill in sorted(selected_skills):
|
|
1227
|
+
console.print(f" • {skill}")
|
|
1228
|
+
console.print()
|
|
1229
|
+
|
|
1230
|
+
# Ask user to confirm, adjust, or cancel
|
|
1231
|
+
confirm_action = questionary.select(
|
|
1232
|
+
"\nWhat would you like to do?",
|
|
1233
|
+
choices=[
|
|
1234
|
+
Choice("Save to configuration", value="apply"),
|
|
1235
|
+
Choice("Adjust selection", value="adjust"),
|
|
1236
|
+
Choice("Cancel", value="cancel"),
|
|
1237
|
+
],
|
|
1238
|
+
default="apply",
|
|
1239
|
+
style=QUESTIONARY_STYLE,
|
|
1240
|
+
).ask()
|
|
1241
|
+
|
|
1242
|
+
if confirm_action == "cancel":
|
|
1243
|
+
console.print("[yellow]Configuration cancelled[/yellow]")
|
|
1244
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1245
|
+
return CommandResult(success=True, exit_code=0)
|
|
1246
|
+
|
|
1247
|
+
if confirm_action == "adjust":
|
|
1248
|
+
# Update selection state and loop back
|
|
1249
|
+
for skill in all_skills:
|
|
1250
|
+
skill["is_selected"] = skill["name"] in selected_skills
|
|
1251
|
+
console.print("\n[dim]Adjusting selection...[/dim]\n")
|
|
1252
|
+
continue
|
|
1253
|
+
|
|
1254
|
+
# Save to configuration.yaml
|
|
1255
|
+
with open(project_config_path, encoding="utf-8") as f:
|
|
1256
|
+
config = yaml.safe_load(f) or {}
|
|
1257
|
+
|
|
1258
|
+
if "skills" not in config:
|
|
1259
|
+
config["skills"] = {}
|
|
1260
|
+
|
|
1261
|
+
config["skills"]["user_defined"] = sorted(selected_skills)
|
|
1262
|
+
|
|
1263
|
+
with open(project_config_path, "w", encoding="utf-8") as f:
|
|
1264
|
+
yaml.dump(config, f, default_flow_style=False, sort_keys=False)
|
|
1047
1265
|
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1266
|
+
console.print(
|
|
1267
|
+
f"\n[green]✓ Saved {len(selected_skills)} skills to user_defined mode[/green]"
|
|
1268
|
+
)
|
|
1269
|
+
console.print(
|
|
1270
|
+
"[yellow]⚠️ Important:[/yellow] Run [cyan]claude-mpm init[/cyan] to deploy these skills\n"
|
|
1051
1271
|
)
|
|
1272
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1052
1273
|
|
|
1053
|
-
|
|
1054
|
-
|
|
1274
|
+
# Exit the loop after successful save
|
|
1275
|
+
break
|
|
1055
1276
|
|
|
1056
|
-
|
|
1057
|
-
selected_skills = questionary.checkbox(
|
|
1058
|
-
"Select skills (Space to toggle, Enter to confirm):",
|
|
1059
|
-
choices=skill_choices,
|
|
1060
|
-
style=QUESTIONARY_STYLE,
|
|
1061
|
-
).ask()
|
|
1277
|
+
return CommandResult(success=True, exit_code=0)
|
|
1062
1278
|
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1279
|
+
except Exception as e:
|
|
1280
|
+
console.print(f"[red]Error in skills configuration: {e}[/red]")
|
|
1281
|
+
import traceback
|
|
1282
|
+
|
|
1283
|
+
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
1284
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1067
1285
|
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
to_remove = []
|
|
1286
|
+
def _select_skills_interactive(self, args) -> CommandResult:
|
|
1287
|
+
"""Interactive skill selection with topic grouping.
|
|
1071
1288
|
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
is_selected = skill_name in selected_skills
|
|
1289
|
+
This command provides a two-tier selection interface:
|
|
1290
|
+
1. Select topic groups (toolchains) to explore
|
|
1291
|
+
2. Multi-select skills within each topic group
|
|
1076
1292
|
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1293
|
+
Features:
|
|
1294
|
+
- Groups skills by toolchain (universal, python, typescript, etc.)
|
|
1295
|
+
- Shows skills auto-included by agent dependencies
|
|
1296
|
+
- Displays token counts for each skill
|
|
1297
|
+
- Updates config and runs reconciliation
|
|
1081
1298
|
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1299
|
+
Returns:
|
|
1300
|
+
CommandResult with success/failure status
|
|
1301
|
+
"""
|
|
1302
|
+
try:
|
|
1303
|
+
from ...cli.interactive.skill_selector import run_skill_selector
|
|
1304
|
+
from ...core.unified_config import UnifiedConfig
|
|
1305
|
+
from ...services.agents.deployment.deployment_reconciler import (
|
|
1306
|
+
DeploymentReconciler,
|
|
1307
|
+
)
|
|
1090
1308
|
|
|
1091
|
-
|
|
1309
|
+
console.print("\n[bold cyan]Interactive Skill Selector[/bold cyan]\n")
|
|
1310
|
+
|
|
1311
|
+
# Run skill selector
|
|
1312
|
+
selected_skills = run_skill_selector()
|
|
1313
|
+
|
|
1314
|
+
if selected_skills is None:
|
|
1315
|
+
console.print("\n[yellow]Skill selection cancelled[/yellow]")
|
|
1316
|
+
return CommandResult(success=True, exit_code=0)
|
|
1317
|
+
|
|
1318
|
+
# Update config with selected skills
|
|
1319
|
+
config = UnifiedConfig()
|
|
1320
|
+
config.skills.enabled = selected_skills
|
|
1321
|
+
|
|
1322
|
+
# Save config
|
|
1323
|
+
try:
|
|
1324
|
+
config.save()
|
|
1325
|
+
console.print(
|
|
1326
|
+
f"\n[green]✓ Saved {len(selected_skills)} skills to configuration[/green]"
|
|
1327
|
+
)
|
|
1328
|
+
except Exception as e:
|
|
1329
|
+
console.print(f"\n[red]Failed to save configuration: {e}[/red]")
|
|
1330
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1331
|
+
|
|
1332
|
+
# Run reconciliation to deploy skills
|
|
1333
|
+
console.print("\n[cyan]Running skill reconciliation...[/cyan]")
|
|
1334
|
+
reconciler = DeploymentReconciler(config)
|
|
1335
|
+
|
|
1336
|
+
try:
|
|
1337
|
+
from pathlib import Path
|
|
1338
|
+
|
|
1339
|
+
project_path = Path.cwd()
|
|
1340
|
+
result = reconciler.reconcile_skills(project_path)
|
|
1341
|
+
|
|
1342
|
+
if result.deployed:
|
|
1092
1343
|
console.print(
|
|
1093
|
-
f"
|
|
1344
|
+
f" [green]✓ Deployed: {', '.join(result.deployed)}[/green]"
|
|
1094
1345
|
)
|
|
1095
|
-
|
|
1096
|
-
console.print(f" • {skill}")
|
|
1097
|
-
|
|
1098
|
-
if not to_install and not to_remove:
|
|
1346
|
+
if result.removed:
|
|
1099
1347
|
console.print(
|
|
1100
|
-
"
|
|
1348
|
+
f" [yellow]✓ Removed: {', '.join(result.removed)}[/yellow]"
|
|
1101
1349
|
)
|
|
1350
|
+
if result.errors:
|
|
1351
|
+
for error in result.errors:
|
|
1352
|
+
console.print(f" [red]✗ {error}[/red]")
|
|
1102
1353
|
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
# Ask user to confirm, adjust, or cancel
|
|
1106
|
-
action = questionary.select(
|
|
1107
|
-
"\nWhat would you like to do?",
|
|
1108
|
-
choices=[
|
|
1109
|
-
Choice("Apply these changes", value="apply"),
|
|
1110
|
-
Choice("Adjust selection", value="adjust"),
|
|
1111
|
-
Choice("Cancel", value="cancel"),
|
|
1112
|
-
],
|
|
1113
|
-
default="apply",
|
|
1114
|
-
style=QUESTIONARY_STYLE,
|
|
1115
|
-
).ask()
|
|
1116
|
-
|
|
1117
|
-
if action == "cancel":
|
|
1118
|
-
console.print("[yellow]Changes cancelled[/yellow]")
|
|
1119
|
-
Prompt.ask("\nPress Enter to continue")
|
|
1120
|
-
return CommandResult(success=True, exit_code=0)
|
|
1121
|
-
if action == "adjust":
|
|
1122
|
-
# Loop back to skill selection
|
|
1123
|
-
console.print("\n[dim]Adjusting selection...[/dim]\n")
|
|
1124
|
-
continue
|
|
1125
|
-
|
|
1126
|
-
# Apply changes
|
|
1127
|
-
success = True
|
|
1128
|
-
errors = []
|
|
1129
|
-
|
|
1130
|
-
# Install skills
|
|
1131
|
-
if to_install:
|
|
1132
|
-
console.print("\n[bold cyan]Installing skills...[/bold cyan]\n")
|
|
1133
|
-
for skill_name in to_install:
|
|
1134
|
-
try:
|
|
1135
|
-
# Deploy single skill
|
|
1136
|
-
result = self.skills_deployer.deploy_skills(
|
|
1137
|
-
skill_names=[skill_name], force=False
|
|
1138
|
-
)
|
|
1139
|
-
|
|
1140
|
-
if result.get("errors"):
|
|
1141
|
-
errors.extend(result["errors"])
|
|
1142
|
-
success = False
|
|
1143
|
-
else:
|
|
1144
|
-
console.print(
|
|
1145
|
-
f"[green]✓ Installed: {skill_name}[/green]"
|
|
1146
|
-
)
|
|
1147
|
-
except Exception as e:
|
|
1148
|
-
errors.append(f"Failed to install {skill_name}: {e}")
|
|
1149
|
-
success = False
|
|
1150
|
-
|
|
1151
|
-
# Remove skills
|
|
1152
|
-
if to_remove:
|
|
1153
|
-
console.print("\n[bold yellow]Removing skills...[/bold yellow]\n")
|
|
1154
|
-
for skill_name in to_remove:
|
|
1155
|
-
try:
|
|
1156
|
-
# Remove single skill
|
|
1157
|
-
result = self.skills_deployer.remove_skills(
|
|
1158
|
-
skill_names=[skill_name]
|
|
1159
|
-
)
|
|
1160
|
-
|
|
1161
|
-
if result.get("errors"):
|
|
1162
|
-
errors.extend(result["errors"])
|
|
1163
|
-
success = False
|
|
1164
|
-
else:
|
|
1165
|
-
console.print(
|
|
1166
|
-
f"[yellow]✗ Removed: {skill_name}[/yellow]"
|
|
1167
|
-
)
|
|
1168
|
-
except Exception as e:
|
|
1169
|
-
errors.append(f"Failed to remove {skill_name}: {e}")
|
|
1170
|
-
success = False
|
|
1171
|
-
|
|
1172
|
-
# Show errors if any
|
|
1173
|
-
if errors:
|
|
1174
|
-
console.print(f"\n[red]✗ {len(errors)} error(s):[/red]")
|
|
1175
|
-
for error in errors:
|
|
1176
|
-
console.print(f" • {error}")
|
|
1177
|
-
|
|
1178
|
-
# Show restart instructions
|
|
1179
|
-
if success and (to_install or to_remove):
|
|
1354
|
+
if result.success:
|
|
1180
1355
|
console.print(
|
|
1181
|
-
"\n[bold green]✓
|
|
1356
|
+
"\n[bold green]✓ Skill deployment complete![/bold green]"
|
|
1182
1357
|
)
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1358
|
+
return CommandResult(success=True, exit_code=0)
|
|
1359
|
+
console.print(
|
|
1360
|
+
f"\n[yellow]⚠ Deployment had {len(result.errors)} errors[/yellow]"
|
|
1361
|
+
)
|
|
1362
|
+
return CommandResult(
|
|
1363
|
+
success=False,
|
|
1364
|
+
message=f"{len(result.errors)} deployment errors",
|
|
1365
|
+
exit_code=1,
|
|
1366
|
+
)
|
|
1191
1367
|
|
|
1192
|
-
|
|
1193
|
-
|
|
1368
|
+
except Exception as e:
|
|
1369
|
+
console.print(f"\n[red]Reconciliation failed: {e}[/red]")
|
|
1370
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1194
1371
|
|
|
1195
1372
|
except Exception as e:
|
|
1196
|
-
console.print(f"[red]
|
|
1373
|
+
console.print(f"[red]Skill selection error: {e}[/red]")
|
|
1197
1374
|
import traceback
|
|
1198
1375
|
|
|
1199
1376
|
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
1200
1377
|
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1201
1378
|
|
|
1202
|
-
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1203
|
-
|
|
1204
1379
|
|
|
1205
1380
|
def manage_skills(args) -> int:
|
|
1206
1381
|
"""
|