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
|
@@ -3,13 +3,16 @@ Auto-Configuration CLI Command for Claude MPM Framework
|
|
|
3
3
|
========================================================
|
|
4
4
|
|
|
5
5
|
WHY: This module provides a user-friendly CLI interface for the auto-configuration
|
|
6
|
-
feature, allowing users to automatically configure agents based on
|
|
6
|
+
feature, allowing users to automatically configure BOTH agents AND skills based on
|
|
7
|
+
detected toolchain.
|
|
7
8
|
|
|
8
9
|
DESIGN DECISION: Uses rich for beautiful terminal output, implements interactive
|
|
9
10
|
confirmation, and provides comprehensive error handling. Supports both interactive
|
|
10
|
-
and non-interactive modes for flexibility.
|
|
11
|
+
and non-interactive modes for flexibility. Orchestrates both agent auto-config
|
|
12
|
+
(via AutoConfigManagerService) and skill recommendations (via SkillsDeployer).
|
|
11
13
|
|
|
12
14
|
Part of TSK-0054: Auto-Configuration Feature - Phase 5
|
|
15
|
+
Unified Auto-Configure: 1M-502 Phase 2
|
|
13
16
|
"""
|
|
14
17
|
|
|
15
18
|
import json
|
|
@@ -18,7 +21,6 @@ from typing import Optional
|
|
|
18
21
|
|
|
19
22
|
try:
|
|
20
23
|
from rich.console import Console
|
|
21
|
-
from rich.panel import Panel
|
|
22
24
|
from rich.progress import BarColumn, Progress, SpinnerColumn, TextColumn
|
|
23
25
|
from rich.table import Table
|
|
24
26
|
|
|
@@ -29,7 +31,6 @@ except ImportError:
|
|
|
29
31
|
from ...core.enums import OperationResult
|
|
30
32
|
from ...services.agents.auto_config_manager import AutoConfigManagerService
|
|
31
33
|
from ...services.agents.observers import NullObserver
|
|
32
|
-
from ...services.core.models.agent_config import ConfigurationResult
|
|
33
34
|
from ..shared import BaseCommand, CommandResult
|
|
34
35
|
|
|
35
36
|
|
|
@@ -100,7 +101,11 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
100
101
|
Handle auto-configuration CLI commands.
|
|
101
102
|
|
|
102
103
|
This command provides a user-friendly interface for automatically configuring
|
|
103
|
-
agents based on detected project toolchain.
|
|
104
|
+
BOTH agents AND skills based on detected project toolchain.
|
|
105
|
+
|
|
106
|
+
Orchestrates:
|
|
107
|
+
1. Agent auto-configuration (via AutoConfigManagerService)
|
|
108
|
+
2. Skills recommendations and deployment (via SkillsDeployer + agent-skill mapping)
|
|
104
109
|
"""
|
|
105
110
|
|
|
106
111
|
def __init__(self):
|
|
@@ -108,6 +113,7 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
108
113
|
super().__init__("auto-configure")
|
|
109
114
|
self.console = Console() if RICH_AVAILABLE else None
|
|
110
115
|
self._auto_config_manager = None
|
|
116
|
+
self._skills_deployer = None
|
|
111
117
|
|
|
112
118
|
@property
|
|
113
119
|
def auto_config_manager(self) -> AutoConfigManagerService:
|
|
@@ -140,6 +146,15 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
140
146
|
|
|
141
147
|
return self._auto_config_manager
|
|
142
148
|
|
|
149
|
+
@property
|
|
150
|
+
def skills_deployer(self):
|
|
151
|
+
"""Get skills deployer instance (lazy loaded)."""
|
|
152
|
+
if self._skills_deployer is None:
|
|
153
|
+
from ...services.skills_deployer import SkillsDeployerService
|
|
154
|
+
|
|
155
|
+
self._skills_deployer = SkillsDeployerService()
|
|
156
|
+
return self._skills_deployer
|
|
157
|
+
|
|
143
158
|
def validate_args(self, args) -> Optional[str]:
|
|
144
159
|
"""Validate command arguments."""
|
|
145
160
|
# Validate project path
|
|
@@ -191,11 +206,26 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
191
206
|
skip_confirmation = args.yes if hasattr(args, "yes") and args.yes else False
|
|
192
207
|
json_output = args.json if hasattr(args, "json") and args.json else False
|
|
193
208
|
|
|
209
|
+
# Determine what to configure (agents, skills, or both)
|
|
210
|
+
configure_agents = not getattr(args, "skills_only", False)
|
|
211
|
+
configure_skills = not getattr(args, "agents_only", False)
|
|
212
|
+
|
|
194
213
|
# Run preview or full configuration
|
|
195
214
|
if dry_run or args.preview if hasattr(args, "preview") else False:
|
|
196
|
-
return self._run_preview(
|
|
215
|
+
return self._run_preview(
|
|
216
|
+
project_path,
|
|
217
|
+
min_confidence,
|
|
218
|
+
json_output,
|
|
219
|
+
configure_agents,
|
|
220
|
+
configure_skills,
|
|
221
|
+
)
|
|
197
222
|
return self._run_full_configuration(
|
|
198
|
-
project_path,
|
|
223
|
+
project_path,
|
|
224
|
+
min_confidence,
|
|
225
|
+
skip_confirmation,
|
|
226
|
+
json_output,
|
|
227
|
+
configure_agents,
|
|
228
|
+
configure_skills,
|
|
199
229
|
)
|
|
200
230
|
|
|
201
231
|
except KeyboardInterrupt:
|
|
@@ -215,24 +245,61 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
215
245
|
return CommandResult.error_result(error_msg)
|
|
216
246
|
|
|
217
247
|
def _run_preview(
|
|
218
|
-
self,
|
|
248
|
+
self,
|
|
249
|
+
project_path: Path,
|
|
250
|
+
min_confidence: float,
|
|
251
|
+
json_output: bool,
|
|
252
|
+
configure_agents: bool = True,
|
|
253
|
+
configure_skills: bool = True,
|
|
219
254
|
) -> CommandResult:
|
|
220
255
|
"""Run configuration preview without deploying."""
|
|
221
|
-
#
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
256
|
+
# Get agent preview
|
|
257
|
+
agent_preview = None
|
|
258
|
+
if configure_agents:
|
|
259
|
+
if self.console and not json_output:
|
|
260
|
+
with self.console.status("[bold green]Analyzing project toolchain..."):
|
|
261
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
262
|
+
project_path, min_confidence
|
|
263
|
+
)
|
|
264
|
+
else:
|
|
265
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
225
266
|
project_path, min_confidence
|
|
226
267
|
)
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
268
|
+
|
|
269
|
+
# Review existing project agents
|
|
270
|
+
agent_review_results = None
|
|
271
|
+
if configure_agents:
|
|
272
|
+
if self.console and not json_output:
|
|
273
|
+
with self.console.status("[bold green]Reviewing existing agents..."):
|
|
274
|
+
agent_review_results = self._review_project_agents(agent_preview)
|
|
275
|
+
else:
|
|
276
|
+
agent_review_results = self._review_project_agents(agent_preview)
|
|
277
|
+
|
|
278
|
+
# Get skills recommendations
|
|
279
|
+
skills_recommendations = None
|
|
280
|
+
if configure_skills:
|
|
281
|
+
if self.console and not json_output:
|
|
282
|
+
with self.console.status("[bold green]Analyzing skill requirements..."):
|
|
283
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
284
|
+
else:
|
|
285
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
231
286
|
|
|
232
287
|
# Output results
|
|
233
288
|
if json_output:
|
|
234
|
-
return self._output_preview_json(
|
|
235
|
-
|
|
289
|
+
return self._output_preview_json(
|
|
290
|
+
agent_preview,
|
|
291
|
+
skills_recommendations,
|
|
292
|
+
configure_agents,
|
|
293
|
+
configure_skills,
|
|
294
|
+
agent_review_results,
|
|
295
|
+
)
|
|
296
|
+
return self._display_preview(
|
|
297
|
+
agent_preview,
|
|
298
|
+
skills_recommendations,
|
|
299
|
+
configure_agents,
|
|
300
|
+
configure_skills,
|
|
301
|
+
agent_review_results,
|
|
302
|
+
)
|
|
236
303
|
|
|
237
304
|
def _run_full_configuration(
|
|
238
305
|
self,
|
|
@@ -240,147 +307,281 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
240
307
|
min_confidence: float,
|
|
241
308
|
skip_confirmation: bool,
|
|
242
309
|
json_output: bool,
|
|
310
|
+
configure_agents: bool = True,
|
|
311
|
+
configure_skills: bool = True,
|
|
243
312
|
) -> CommandResult:
|
|
244
313
|
"""Run full auto-configuration with deployment."""
|
|
245
|
-
# Get preview
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
314
|
+
# Get agent preview
|
|
315
|
+
agent_preview = None
|
|
316
|
+
if configure_agents:
|
|
317
|
+
if self.console and not json_output:
|
|
318
|
+
with self.console.status("[bold green]Analyzing project toolchain..."):
|
|
319
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
320
|
+
project_path, min_confidence
|
|
321
|
+
)
|
|
322
|
+
else:
|
|
323
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
249
324
|
project_path, min_confidence
|
|
250
325
|
)
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
326
|
+
|
|
327
|
+
# Review existing project agents
|
|
328
|
+
agent_review_results = None
|
|
329
|
+
if configure_agents:
|
|
330
|
+
if self.console and not json_output:
|
|
331
|
+
with self.console.status("[bold green]Reviewing existing agents..."):
|
|
332
|
+
agent_review_results = self._review_project_agents(agent_preview)
|
|
333
|
+
else:
|
|
334
|
+
agent_review_results = self._review_project_agents(agent_preview)
|
|
335
|
+
|
|
336
|
+
# Get skills recommendations
|
|
337
|
+
skills_recommendations = None
|
|
338
|
+
if configure_skills:
|
|
339
|
+
if self.console and not json_output:
|
|
340
|
+
with self.console.status("[bold green]Analyzing skill requirements..."):
|
|
341
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
342
|
+
else:
|
|
343
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
255
344
|
|
|
256
345
|
# Display preview (unless JSON output)
|
|
257
346
|
if not json_output:
|
|
258
|
-
self._display_preview(
|
|
347
|
+
self._display_preview(
|
|
348
|
+
agent_preview,
|
|
349
|
+
skills_recommendations,
|
|
350
|
+
configure_agents,
|
|
351
|
+
configure_skills,
|
|
352
|
+
agent_review_results,
|
|
353
|
+
)
|
|
259
354
|
|
|
260
355
|
# Ask for confirmation (unless skipped)
|
|
261
356
|
if not skip_confirmation and not json_output:
|
|
262
|
-
if not self._confirm_deployment(
|
|
357
|
+
if not self._confirm_deployment(
|
|
358
|
+
agent_preview,
|
|
359
|
+
skills_recommendations,
|
|
360
|
+
configure_agents,
|
|
361
|
+
configure_skills,
|
|
362
|
+
agent_review_results,
|
|
363
|
+
):
|
|
263
364
|
if self.console:
|
|
264
365
|
self.console.print("\nā Operation cancelled by user")
|
|
265
366
|
else:
|
|
266
367
|
print("\nOperation cancelled by user")
|
|
267
368
|
return CommandResult.error_result("Operation cancelled", exit_code=0)
|
|
268
369
|
|
|
269
|
-
#
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
370
|
+
# Archive unused agents (before deploying new ones)
|
|
371
|
+
archive_result = None
|
|
372
|
+
if configure_agents and agent_review_results:
|
|
373
|
+
agents_to_archive = agent_review_results.get("unused", [])
|
|
374
|
+
if agents_to_archive:
|
|
375
|
+
if self.console and not json_output:
|
|
376
|
+
self.console.print(
|
|
377
|
+
"\n[bold yellow]Archiving unused agents...[/bold yellow]\n"
|
|
378
|
+
)
|
|
379
|
+
archive_result = self._archive_agents(agents_to_archive)
|
|
380
|
+
|
|
381
|
+
# Execute agent configuration
|
|
382
|
+
agent_result = None
|
|
383
|
+
if configure_agents and agent_preview:
|
|
384
|
+
import asyncio
|
|
385
|
+
|
|
386
|
+
observer = RichProgressObserver(self.console) if self.console else None
|
|
387
|
+
agent_result = asyncio.run(
|
|
388
|
+
self.auto_config_manager.auto_configure(
|
|
389
|
+
project_path,
|
|
390
|
+
confirmation_required=False, # Already confirmed above
|
|
391
|
+
dry_run=False,
|
|
392
|
+
min_confidence=min_confidence,
|
|
393
|
+
observer=observer,
|
|
394
|
+
)
|
|
280
395
|
)
|
|
281
|
-
|
|
396
|
+
|
|
397
|
+
# Deploy skills
|
|
398
|
+
skills_result = None
|
|
399
|
+
if configure_skills and skills_recommendations:
|
|
400
|
+
if self.console and not json_output:
|
|
401
|
+
self.console.print("\n[bold cyan]Deploying skills...[/bold cyan]\n")
|
|
402
|
+
skills_result = self._deploy_skills(skills_recommendations)
|
|
282
403
|
|
|
283
404
|
# Output results
|
|
284
405
|
if json_output:
|
|
285
|
-
return self._output_result_json(
|
|
286
|
-
return self._display_result(
|
|
406
|
+
return self._output_result_json(agent_result, skills_result, archive_result)
|
|
407
|
+
return self._display_result(agent_result, skills_result, archive_result)
|
|
287
408
|
|
|
288
|
-
def _display_preview(
|
|
409
|
+
def _display_preview(
|
|
410
|
+
self,
|
|
411
|
+
agent_preview,
|
|
412
|
+
skills_recommendations=None,
|
|
413
|
+
configure_agents=True,
|
|
414
|
+
configure_skills=True,
|
|
415
|
+
agent_review_results=None,
|
|
416
|
+
) -> CommandResult:
|
|
289
417
|
"""Display configuration preview with Rich formatting."""
|
|
290
418
|
if not self.console:
|
|
291
419
|
# Fallback to plain text
|
|
292
|
-
return self._display_preview_plain(
|
|
420
|
+
return self._display_preview_plain(
|
|
421
|
+
agent_preview,
|
|
422
|
+
skills_recommendations,
|
|
423
|
+
configure_agents,
|
|
424
|
+
configure_skills,
|
|
425
|
+
agent_review_results,
|
|
426
|
+
)
|
|
293
427
|
|
|
294
|
-
#
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
toolchain_table = Table(show_header=True, header_style="bold")
|
|
298
|
-
toolchain_table.add_column("Component", style="cyan")
|
|
299
|
-
toolchain_table.add_column("Version", style="yellow")
|
|
300
|
-
toolchain_table.add_column("Confidence", style="green")
|
|
301
|
-
|
|
302
|
-
for component in preview.detected_toolchain.components:
|
|
303
|
-
confidence_pct = int(component.confidence * 100)
|
|
304
|
-
bar = "ā" * (confidence_pct // 10) + "ā" * (10 - confidence_pct // 10)
|
|
305
|
-
confidence_str = f"{bar} {confidence_pct}%"
|
|
306
|
-
|
|
307
|
-
toolchain_table.add_row(
|
|
308
|
-
(
|
|
309
|
-
component.type.value
|
|
310
|
-
if hasattr(component.type, "value")
|
|
311
|
-
else str(component.type)
|
|
312
|
-
),
|
|
313
|
-
component.version or "Unknown",
|
|
314
|
-
confidence_str,
|
|
315
|
-
)
|
|
428
|
+
# Only show toolchain and agents if configuring agents
|
|
429
|
+
if not configure_agents:
|
|
430
|
+
agent_preview = None
|
|
316
431
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
self.console.print("
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
self.console.print(
|
|
432
|
+
# Display detected toolchain
|
|
433
|
+
if configure_agents and agent_preview:
|
|
434
|
+
self.console.print("\nš Detected Toolchain:", style="bold blue")
|
|
435
|
+
if (
|
|
436
|
+
agent_preview.detected_toolchain
|
|
437
|
+
and agent_preview.detected_toolchain.components
|
|
438
|
+
):
|
|
439
|
+
toolchain_table = Table(show_header=True, header_style="bold")
|
|
440
|
+
toolchain_table.add_column("Component", style="cyan")
|
|
441
|
+
toolchain_table.add_column("Version", style="yellow")
|
|
442
|
+
toolchain_table.add_column("Confidence", style="green")
|
|
443
|
+
|
|
444
|
+
for component in agent_preview.detected_toolchain.components:
|
|
445
|
+
confidence_pct = int(component.confidence * 100)
|
|
446
|
+
bar = "ā" * (confidence_pct // 10) + "ā" * (
|
|
447
|
+
10 - confidence_pct // 10
|
|
448
|
+
)
|
|
449
|
+
confidence_str = f"{bar} {confidence_pct}%"
|
|
450
|
+
|
|
451
|
+
toolchain_table.add_row(
|
|
452
|
+
(
|
|
453
|
+
component.type.value
|
|
454
|
+
if hasattr(component.type, "value")
|
|
455
|
+
else str(component.type)
|
|
456
|
+
),
|
|
457
|
+
component.version or "Unknown",
|
|
458
|
+
confidence_str,
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
self.console.print(toolchain_table)
|
|
462
|
+
else:
|
|
463
|
+
self.console.print(" No toolchain detected", style="yellow")
|
|
464
|
+
|
|
465
|
+
# Display recommended agents
|
|
466
|
+
self.console.print("\nš¤ Recommended Agents:", style="bold blue")
|
|
467
|
+
if agent_preview.recommendations:
|
|
468
|
+
for rec in agent_preview.recommendations:
|
|
469
|
+
confidence_pct = int(rec.confidence * 100)
|
|
470
|
+
icon = "ā" if rec.confidence >= 0.8 else "ā"
|
|
471
|
+
self.console.print(
|
|
472
|
+
f" {icon} [bold]{rec.agent_id}[/bold] ({confidence_pct}% confidence)"
|
|
473
|
+
)
|
|
474
|
+
self.console.print(f" Reason: {rec.reasoning}", style="dim")
|
|
475
|
+
else:
|
|
476
|
+
self.console.print(" No agents recommended", style="yellow")
|
|
477
|
+
|
|
478
|
+
# Display validation issues
|
|
479
|
+
if (
|
|
480
|
+
agent_preview.validation_result
|
|
481
|
+
and agent_preview.validation_result.issues
|
|
482
|
+
):
|
|
483
|
+
self.console.print("\nā ļø Validation Issues:", style="bold yellow")
|
|
484
|
+
for issue in agent_preview.validation_result.issues:
|
|
485
|
+
severity_icon = {"error": "ā", "warning": "ā ļø", "info": "ā¹ļø"}.get(
|
|
486
|
+
(
|
|
487
|
+
issue.severity.value
|
|
488
|
+
if hasattr(issue.severity, "value")
|
|
489
|
+
else str(issue.severity)
|
|
490
|
+
),
|
|
491
|
+
"ā¢",
|
|
492
|
+
)
|
|
493
|
+
self.console.print(
|
|
494
|
+
f" {severity_icon} {issue.message}", style="yellow"
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
# Display agent review results
|
|
498
|
+
if configure_agents and agent_review_results:
|
|
499
|
+
self._display_agent_review(agent_review_results)
|
|
500
|
+
|
|
501
|
+
# Display recommended skills
|
|
502
|
+
if configure_skills and skills_recommendations:
|
|
503
|
+
self.console.print("\nšÆ Recommended Skills:", style="bold blue")
|
|
504
|
+
for skill in skills_recommendations:
|
|
505
|
+
self.console.print(f" ā [bold]{skill}[/bold]")
|
|
347
506
|
|
|
348
507
|
return CommandResult.success_result()
|
|
349
508
|
|
|
350
|
-
def _display_preview_plain(
|
|
509
|
+
def _display_preview_plain(
|
|
510
|
+
self,
|
|
511
|
+
agent_preview,
|
|
512
|
+
skills_recommendations=None,
|
|
513
|
+
configure_agents=True,
|
|
514
|
+
configure_skills=True,
|
|
515
|
+
agent_review_results=None,
|
|
516
|
+
) -> CommandResult:
|
|
351
517
|
"""Display preview in plain text (fallback when Rich not available)."""
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
print(
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
518
|
+
if configure_agents and agent_preview:
|
|
519
|
+
print("\nDetected Toolchain:")
|
|
520
|
+
if (
|
|
521
|
+
agent_preview.detected_toolchain
|
|
522
|
+
and agent_preview.detected_toolchain.components
|
|
523
|
+
):
|
|
524
|
+
for component in agent_preview.detected_toolchain.components:
|
|
525
|
+
confidence_pct = int(component.confidence * 100)
|
|
526
|
+
print(
|
|
527
|
+
f" - {component.type}: {component.version} ({confidence_pct}%)"
|
|
528
|
+
)
|
|
529
|
+
else:
|
|
530
|
+
print(" No toolchain detected")
|
|
531
|
+
|
|
532
|
+
print("\nRecommended Agents:")
|
|
533
|
+
if agent_preview.recommendations:
|
|
534
|
+
for rec in agent_preview.recommendations:
|
|
535
|
+
confidence_pct = int(rec.confidence * 100)
|
|
536
|
+
print(f" - {rec.agent_id} ({confidence_pct}%)")
|
|
537
|
+
print(f" Reason: {rec.reasoning}")
|
|
538
|
+
else:
|
|
539
|
+
print(" No agents recommended")
|
|
540
|
+
|
|
541
|
+
if (
|
|
542
|
+
agent_preview.validation_result
|
|
543
|
+
and agent_preview.validation_result.issues
|
|
544
|
+
):
|
|
545
|
+
print("\nValidation Issues:")
|
|
546
|
+
for issue in agent_preview.validation_result.issues:
|
|
547
|
+
print(f" - {issue.severity}: {issue.message}")
|
|
368
548
|
|
|
369
|
-
if
|
|
370
|
-
print("\
|
|
371
|
-
for
|
|
372
|
-
print(f" - {
|
|
549
|
+
if configure_skills and skills_recommendations:
|
|
550
|
+
print("\nRecommended Skills:")
|
|
551
|
+
for skill in skills_recommendations:
|
|
552
|
+
print(f" - {skill}")
|
|
373
553
|
|
|
374
554
|
return CommandResult.success_result()
|
|
375
555
|
|
|
376
|
-
def _confirm_deployment(
|
|
556
|
+
def _confirm_deployment(
|
|
557
|
+
self,
|
|
558
|
+
agent_preview,
|
|
559
|
+
skills_recommendations=None,
|
|
560
|
+
configure_agents=True,
|
|
561
|
+
configure_skills=True,
|
|
562
|
+
agent_review_results=None,
|
|
563
|
+
) -> bool:
|
|
377
564
|
"""Ask user to confirm deployment."""
|
|
378
|
-
|
|
565
|
+
has_agents = (
|
|
566
|
+
configure_agents and agent_preview and agent_preview.recommendations
|
|
567
|
+
)
|
|
568
|
+
has_skills = configure_skills and skills_recommendations
|
|
569
|
+
|
|
570
|
+
if not has_agents and not has_skills:
|
|
379
571
|
return False
|
|
380
572
|
|
|
573
|
+
# Build confirmation message
|
|
574
|
+
items = []
|
|
575
|
+
if has_agents:
|
|
576
|
+
items.append(f"{len(agent_preview.recommendations)} agent(s)")
|
|
577
|
+
if has_skills:
|
|
578
|
+
items.append(f"{len(skills_recommendations)} skill(s)")
|
|
579
|
+
|
|
580
|
+
message = f"Deploy {' and '.join(items)}?"
|
|
581
|
+
|
|
381
582
|
if self.console:
|
|
382
583
|
self.console.print("\n" + "=" * 60)
|
|
383
|
-
self.console.print(
|
|
584
|
+
self.console.print(message, style="bold yellow")
|
|
384
585
|
self.console.print("=" * 60)
|
|
385
586
|
response = (
|
|
386
587
|
self.console.input("\n[bold]Proceed? (y/n/s for select):[/bold] ")
|
|
@@ -389,7 +590,7 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
389
590
|
)
|
|
390
591
|
else:
|
|
391
592
|
print("\n" + "=" * 60)
|
|
392
|
-
print(
|
|
593
|
+
print(message)
|
|
393
594
|
print("=" * 60)
|
|
394
595
|
response = input("\nProceed? (y/n/s for select): ").strip().lower()
|
|
395
596
|
|
|
@@ -407,160 +608,446 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
407
608
|
return False
|
|
408
609
|
return False
|
|
409
610
|
|
|
410
|
-
def _display_result(
|
|
611
|
+
def _display_result(
|
|
612
|
+
self,
|
|
613
|
+
agent_result: Optional = None,
|
|
614
|
+
skills_result: Optional[dict] = None,
|
|
615
|
+
archive_result: Optional[dict] = None,
|
|
616
|
+
) -> CommandResult:
|
|
411
617
|
"""Display configuration result."""
|
|
412
618
|
if not self.console:
|
|
413
|
-
return self._display_result_plain(
|
|
414
|
-
|
|
415
|
-
# Display summary
|
|
416
|
-
if result.status == OperationResult.SUCCESS:
|
|
417
|
-
panel = Panel(
|
|
418
|
-
f"ā
Auto-configuration completed successfully!\n\n"
|
|
419
|
-
f"Deployed {len(result.deployed_agents)} agent(s)",
|
|
420
|
-
title="Success",
|
|
421
|
-
border_style="green",
|
|
619
|
+
return self._display_result_plain(
|
|
620
|
+
agent_result, skills_result, archive_result
|
|
422
621
|
)
|
|
423
|
-
self.console.print(panel)
|
|
424
622
|
|
|
623
|
+
# Determine overall success
|
|
624
|
+
agent_success = (
|
|
625
|
+
(agent_result and agent_result.status == OperationResult.SUCCESS)
|
|
626
|
+
if agent_result
|
|
627
|
+
else True
|
|
628
|
+
)
|
|
629
|
+
skills_success = not skills_result or (
|
|
630
|
+
skills_result and not skills_result.get("errors")
|
|
631
|
+
)
|
|
632
|
+
archive_success = not archive_result or not archive_result.get("errors")
|
|
633
|
+
overall_success = agent_success and skills_success and archive_success
|
|
634
|
+
|
|
635
|
+
# Display summary
|
|
636
|
+
if overall_success:
|
|
425
637
|
# Show deployed agents
|
|
426
|
-
if
|
|
638
|
+
if agent_result and agent_result.deployed_agents:
|
|
427
639
|
self.console.print("\nš¦ Deployed Agents:", style="bold green")
|
|
428
|
-
for agent_id in
|
|
640
|
+
for agent_id in agent_result.deployed_agents:
|
|
429
641
|
self.console.print(f" ā {agent_id}")
|
|
430
642
|
|
|
643
|
+
# Show deployed skills
|
|
644
|
+
if skills_result and skills_result.get("deployed"):
|
|
645
|
+
self.console.print("\nšÆ Deployed Skills:", style="bold green")
|
|
646
|
+
for skill in skills_result["deployed"]:
|
|
647
|
+
self.console.print(f" ā {skill}")
|
|
648
|
+
|
|
649
|
+
# Show archived agents
|
|
650
|
+
if archive_result and archive_result.get("archived"):
|
|
651
|
+
self.console.print("\nš Archived Agents:", style="bold yellow")
|
|
652
|
+
for archived in archive_result["archived"]:
|
|
653
|
+
self.console.print(f" ā {archived['name']}")
|
|
654
|
+
|
|
655
|
+
# Show restart notification
|
|
656
|
+
self._show_restart_notification(agent_result, skills_result, archive_result)
|
|
657
|
+
|
|
431
658
|
return CommandResult.success_result()
|
|
432
659
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
)
|
|
441
|
-
self.console.print(panel)
|
|
660
|
+
# Partial or complete failure
|
|
661
|
+
has_errors = False
|
|
662
|
+
if agent_result and agent_result.status in [
|
|
663
|
+
OperationResult.WARNING,
|
|
664
|
+
OperationResult.FAILED,
|
|
665
|
+
]:
|
|
666
|
+
has_errors = True
|
|
442
667
|
|
|
443
|
-
if
|
|
668
|
+
if agent_result.status == OperationResult.WARNING:
|
|
669
|
+
self.console.print(
|
|
670
|
+
"\nā ļø Agent configuration partially completed", style="yellow"
|
|
671
|
+
)
|
|
672
|
+
else:
|
|
673
|
+
self.console.print("\nā Agent configuration failed", style="red")
|
|
674
|
+
|
|
675
|
+
if agent_result.failed_agents:
|
|
444
676
|
self.console.print("\nā Failed Agents:", style="bold red")
|
|
445
|
-
for agent_id in
|
|
446
|
-
error =
|
|
677
|
+
for agent_id in agent_result.failed_agents:
|
|
678
|
+
error = agent_result.errors.get(agent_id, "Unknown error")
|
|
447
679
|
self.console.print(f" ā {agent_id}: {error}")
|
|
448
680
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
681
|
+
if skills_result and skills_result.get("errors"):
|
|
682
|
+
has_errors = True
|
|
683
|
+
self.console.print("\nā Skill deployment failed", style="red")
|
|
684
|
+
for error in skills_result["errors"]:
|
|
685
|
+
self.console.print(f" ā {error}")
|
|
686
|
+
|
|
687
|
+
return (
|
|
688
|
+
CommandResult.error_result(
|
|
689
|
+
"Configuration partially succeeded"
|
|
690
|
+
if (agent_success or skills_success)
|
|
691
|
+
else "Configuration failed",
|
|
692
|
+
exit_code=1,
|
|
693
|
+
)
|
|
694
|
+
if has_errors
|
|
695
|
+
else CommandResult.success_result()
|
|
455
696
|
)
|
|
456
|
-
self.console.print(panel)
|
|
457
|
-
|
|
458
|
-
return CommandResult.error_result("Configuration failed", exit_code=1)
|
|
459
697
|
|
|
460
|
-
def _display_result_plain(
|
|
698
|
+
def _display_result_plain(
|
|
699
|
+
self,
|
|
700
|
+
agent_result: Optional = None,
|
|
701
|
+
skills_result: Optional[dict] = None,
|
|
702
|
+
archive_result: Optional[dict] = None,
|
|
703
|
+
) -> CommandResult:
|
|
461
704
|
"""Display result in plain text (fallback)."""
|
|
462
|
-
|
|
705
|
+
# Determine overall success
|
|
706
|
+
agent_success = (
|
|
707
|
+
(agent_result and agent_result.status == OperationResult.SUCCESS)
|
|
708
|
+
if agent_result
|
|
709
|
+
else True
|
|
710
|
+
)
|
|
711
|
+
skills_success = not skills_result or not skills_result.get("errors")
|
|
712
|
+
overall_success = agent_success and skills_success
|
|
713
|
+
|
|
714
|
+
if overall_success:
|
|
463
715
|
print("\nā
Auto-configuration completed successfully!")
|
|
464
|
-
print(f"Deployed {len(result.deployed_agents)} agent(s)")
|
|
465
716
|
|
|
466
|
-
if
|
|
717
|
+
if agent_result and agent_result.deployed_agents:
|
|
718
|
+
print(f"Deployed {len(agent_result.deployed_agents)} agent(s)")
|
|
467
719
|
print("\nDeployed Agents:")
|
|
468
|
-
for agent_id in
|
|
720
|
+
for agent_id in agent_result.deployed_agents:
|
|
469
721
|
print(f" - {agent_id}")
|
|
470
722
|
|
|
723
|
+
if skills_result and skills_result.get("deployed"):
|
|
724
|
+
print(f"\nDeployed {len(skills_result['deployed'])} skill(s)")
|
|
725
|
+
print("\nDeployed Skills:")
|
|
726
|
+
for skill in skills_result["deployed"]:
|
|
727
|
+
print(f" - {skill}")
|
|
728
|
+
|
|
471
729
|
return CommandResult.success_result()
|
|
472
730
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
731
|
+
# Partial or complete failure
|
|
732
|
+
has_errors = False
|
|
733
|
+
if agent_result and agent_result.status in [
|
|
734
|
+
OperationResult.WARNING,
|
|
735
|
+
OperationResult.FAILED,
|
|
736
|
+
]:
|
|
737
|
+
has_errors = True
|
|
738
|
+
print(
|
|
739
|
+
"\nā ļø Agent configuration partially completed"
|
|
740
|
+
if agent_result.status == OperationResult.WARNING
|
|
741
|
+
else "\nā Agent configuration failed"
|
|
742
|
+
)
|
|
477
743
|
|
|
478
|
-
if
|
|
744
|
+
if agent_result.failed_agents:
|
|
479
745
|
print("\nFailed Agents:")
|
|
480
|
-
for agent_id in
|
|
481
|
-
error =
|
|
746
|
+
for agent_id in agent_result.failed_agents:
|
|
747
|
+
error = agent_result.errors.get(agent_id, "Unknown error")
|
|
482
748
|
print(f" - {agent_id}: {error}")
|
|
483
749
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
750
|
+
if skills_result and skills_result.get("errors"):
|
|
751
|
+
has_errors = True
|
|
752
|
+
print("\nā Skill deployment failed")
|
|
753
|
+
for error in skills_result["errors"]:
|
|
754
|
+
print(f" - {error}")
|
|
755
|
+
|
|
756
|
+
return (
|
|
757
|
+
CommandResult.error_result(
|
|
758
|
+
"Configuration partially succeeded"
|
|
759
|
+
if (agent_success or skills_success)
|
|
760
|
+
else "Configuration failed",
|
|
761
|
+
exit_code=1,
|
|
762
|
+
)
|
|
763
|
+
if has_errors
|
|
764
|
+
else CommandResult.success_result()
|
|
765
|
+
)
|
|
490
766
|
|
|
491
|
-
def _output_preview_json(
|
|
767
|
+
def _output_preview_json(
|
|
768
|
+
self,
|
|
769
|
+
agent_preview,
|
|
770
|
+
skills_recommendations=None,
|
|
771
|
+
configure_agents=True,
|
|
772
|
+
configure_skills=True,
|
|
773
|
+
agent_review_results=None,
|
|
774
|
+
) -> CommandResult:
|
|
492
775
|
"""Output preview as JSON."""
|
|
493
|
-
output = {
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
776
|
+
output = {}
|
|
777
|
+
|
|
778
|
+
if configure_agents and agent_preview:
|
|
779
|
+
output["agents"] = {
|
|
780
|
+
"detected_toolchain": {
|
|
781
|
+
"components": (
|
|
782
|
+
[
|
|
783
|
+
{
|
|
784
|
+
"type": (
|
|
785
|
+
c.type.value
|
|
786
|
+
if hasattr(c.type, "value")
|
|
787
|
+
else str(c.type)
|
|
788
|
+
),
|
|
789
|
+
"version": c.version,
|
|
790
|
+
"confidence": c.confidence,
|
|
791
|
+
}
|
|
792
|
+
for c in agent_preview.detected_toolchain.components
|
|
793
|
+
]
|
|
794
|
+
if agent_preview.detected_toolchain
|
|
795
|
+
else []
|
|
796
|
+
)
|
|
797
|
+
},
|
|
798
|
+
"recommendations": [
|
|
799
|
+
{
|
|
800
|
+
"agent_id": r.agent_id,
|
|
801
|
+
"confidence": r.confidence,
|
|
802
|
+
"reasoning": r.reasoning,
|
|
803
|
+
}
|
|
804
|
+
for r in agent_preview.recommendations
|
|
805
|
+
],
|
|
806
|
+
"validation": {
|
|
807
|
+
"is_valid": (
|
|
808
|
+
agent_preview.validation_result.is_valid
|
|
809
|
+
if agent_preview.validation_result
|
|
810
|
+
else True
|
|
811
|
+
),
|
|
812
|
+
"issues": (
|
|
813
|
+
[
|
|
814
|
+
{
|
|
815
|
+
"severity": (
|
|
816
|
+
i.severity.value
|
|
817
|
+
if hasattr(i.severity, "value")
|
|
818
|
+
else str(i.severity)
|
|
819
|
+
),
|
|
820
|
+
"message": i.message,
|
|
821
|
+
}
|
|
822
|
+
for i in agent_preview.validation_result.issues
|
|
823
|
+
]
|
|
824
|
+
if agent_preview.validation_result
|
|
825
|
+
else []
|
|
826
|
+
),
|
|
827
|
+
},
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
if configure_skills and skills_recommendations:
|
|
831
|
+
output["skills"] = {
|
|
832
|
+
"recommendations": skills_recommendations,
|
|
833
|
+
}
|
|
543
834
|
|
|
544
835
|
print(json.dumps(output, indent=2))
|
|
545
836
|
return CommandResult.success_result(data=output)
|
|
546
837
|
|
|
547
|
-
def _output_result_json(
|
|
838
|
+
def _output_result_json(
|
|
839
|
+
self,
|
|
840
|
+
agent_result: Optional = None,
|
|
841
|
+
skills_result: Optional[dict] = None,
|
|
842
|
+
archive_result: Optional[dict] = None,
|
|
843
|
+
) -> CommandResult:
|
|
548
844
|
"""Output result as JSON."""
|
|
549
|
-
output = {
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
845
|
+
output = {}
|
|
846
|
+
|
|
847
|
+
if agent_result:
|
|
848
|
+
output["agents"] = {
|
|
849
|
+
"status": (
|
|
850
|
+
agent_result.status.value
|
|
851
|
+
if hasattr(agent_result.status, "value")
|
|
852
|
+
else str(agent_result.status)
|
|
853
|
+
),
|
|
854
|
+
"deployed_agents": agent_result.deployed_agents,
|
|
855
|
+
"failed_agents": agent_result.failed_agents,
|
|
856
|
+
"errors": agent_result.errors,
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
if skills_result:
|
|
860
|
+
output["skills"] = skills_result
|
|
559
861
|
|
|
560
862
|
print(json.dumps(output, indent=2))
|
|
561
863
|
|
|
562
|
-
|
|
864
|
+
# Determine overall success
|
|
865
|
+
agent_success = (
|
|
866
|
+
agent_result.status == OperationResult.SUCCESS if agent_result else True
|
|
867
|
+
)
|
|
868
|
+
skills_success = not skills_result or not skills_result.get("errors")
|
|
869
|
+
overall_success = agent_success and skills_success
|
|
870
|
+
|
|
871
|
+
if overall_success:
|
|
563
872
|
return CommandResult.success_result(data=output)
|
|
564
873
|
return CommandResult.error_result(
|
|
565
874
|
"Configuration failed or partial", exit_code=1, data=output
|
|
566
875
|
)
|
|
876
|
+
|
|
877
|
+
def _recommend_skills(self, agent_preview):
|
|
878
|
+
"""Recommend skills based on deployed/recommended agents.
|
|
879
|
+
|
|
880
|
+
Args:
|
|
881
|
+
agent_preview: Agent preview result with recommendations
|
|
882
|
+
|
|
883
|
+
Returns:
|
|
884
|
+
List of recommended skill names, or None if no agents recommended
|
|
885
|
+
"""
|
|
886
|
+
if not agent_preview or not agent_preview.recommendations:
|
|
887
|
+
return None
|
|
888
|
+
|
|
889
|
+
# Import agent-skill mapping
|
|
890
|
+
from ...cli.interactive.skills_wizard import AGENT_SKILL_MAPPING
|
|
891
|
+
|
|
892
|
+
# Collect recommended skills based on agent types
|
|
893
|
+
recommended_skills = set()
|
|
894
|
+
for rec in agent_preview.recommendations:
|
|
895
|
+
agent_id = rec.agent_id
|
|
896
|
+
# Map agent ID to skill recommendations
|
|
897
|
+
if agent_id in AGENT_SKILL_MAPPING:
|
|
898
|
+
recommended_skills.update(AGENT_SKILL_MAPPING[agent_id])
|
|
899
|
+
|
|
900
|
+
return list(recommended_skills) if recommended_skills else None
|
|
901
|
+
|
|
902
|
+
def _deploy_skills(self, recommended_skills: list[str]) -> dict:
|
|
903
|
+
"""Deploy recommended skills.
|
|
904
|
+
|
|
905
|
+
Args:
|
|
906
|
+
recommended_skills: List of skill names to deploy
|
|
907
|
+
|
|
908
|
+
Returns:
|
|
909
|
+
Dict with deployment results: {"deployed": [...], "errors": [...]}
|
|
910
|
+
"""
|
|
911
|
+
try:
|
|
912
|
+
return self.skills_deployer.deploy_skills(
|
|
913
|
+
skill_names=recommended_skills, force=False
|
|
914
|
+
)
|
|
915
|
+
except Exception as e:
|
|
916
|
+
self.logger.error(f"Failed to deploy skills: {e}")
|
|
917
|
+
return {"deployed": [], "errors": [str(e)]}
|
|
918
|
+
|
|
919
|
+
def _review_project_agents(self, agent_preview) -> Optional[dict]:
|
|
920
|
+
"""Review existing project agents and categorize them.
|
|
921
|
+
|
|
922
|
+
Args:
|
|
923
|
+
agent_preview: Agent preview result with recommendations
|
|
924
|
+
|
|
925
|
+
Returns:
|
|
926
|
+
Dictionary with categorized agents or None if no preview
|
|
927
|
+
"""
|
|
928
|
+
if not agent_preview:
|
|
929
|
+
return None
|
|
930
|
+
|
|
931
|
+
from ...services.agents.agent_review_service import AgentReviewService
|
|
932
|
+
from ...services.agents.deployment.remote_agent_discovery_service import (
|
|
933
|
+
RemoteAgentDiscoveryService,
|
|
934
|
+
)
|
|
935
|
+
|
|
936
|
+
# Get managed agents from cache
|
|
937
|
+
agents_cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
938
|
+
if not agents_cache_dir.exists():
|
|
939
|
+
self.logger.debug("No agents cache found")
|
|
940
|
+
return None
|
|
941
|
+
|
|
942
|
+
# Discover managed agents
|
|
943
|
+
discovery_service = RemoteAgentDiscoveryService(agents_cache_dir)
|
|
944
|
+
managed_agents = discovery_service.discover_remote_agents()
|
|
945
|
+
|
|
946
|
+
if not managed_agents:
|
|
947
|
+
self.logger.debug("No managed agents found in cache")
|
|
948
|
+
return None
|
|
949
|
+
|
|
950
|
+
# Get recommended agent IDs
|
|
951
|
+
recommended_ids = set()
|
|
952
|
+
if agent_preview.recommendations:
|
|
953
|
+
recommended_ids = {rec.agent_id for rec in agent_preview.recommendations}
|
|
954
|
+
|
|
955
|
+
# Review project agents
|
|
956
|
+
project_agents_dir = Path.cwd() / ".claude" / "agents"
|
|
957
|
+
review_service = AgentReviewService()
|
|
958
|
+
return review_service.review_project_agents(
|
|
959
|
+
project_agents_dir, managed_agents, recommended_ids
|
|
960
|
+
)
|
|
961
|
+
|
|
962
|
+
def _archive_agents(self, agents_to_archive: list[dict]) -> dict:
|
|
963
|
+
"""Archive unused agents by moving them to .claude/agents/unused/.
|
|
964
|
+
|
|
965
|
+
Args:
|
|
966
|
+
agents_to_archive: List of agent dicts to archive
|
|
967
|
+
|
|
968
|
+
Returns:
|
|
969
|
+
Dictionary with archival results
|
|
970
|
+
"""
|
|
971
|
+
from ...services.agents.agent_review_service import AgentReviewService
|
|
972
|
+
|
|
973
|
+
project_agents_dir = Path.cwd() / ".claude" / "agents"
|
|
974
|
+
review_service = AgentReviewService()
|
|
975
|
+
return review_service.archive_agents(agents_to_archive, project_agents_dir)
|
|
976
|
+
|
|
977
|
+
def _display_agent_review(self, review_results: dict) -> None:
|
|
978
|
+
"""Display agent review results in the preview.
|
|
979
|
+
|
|
980
|
+
Args:
|
|
981
|
+
review_results: Dictionary with categorized agents
|
|
982
|
+
"""
|
|
983
|
+
if not self.console:
|
|
984
|
+
return
|
|
985
|
+
|
|
986
|
+
# Count agents to archive
|
|
987
|
+
unused_count = len(review_results.get("unused", []))
|
|
988
|
+
outdated_count = len(review_results.get("outdated", []))
|
|
989
|
+
custom_count = len(review_results.get("custom", []))
|
|
990
|
+
|
|
991
|
+
if unused_count > 0 or outdated_count > 0 or custom_count > 0:
|
|
992
|
+
self.console.print("\nš Existing Agents Review:", style="bold blue")
|
|
993
|
+
|
|
994
|
+
# Show custom agents (will be preserved)
|
|
995
|
+
if custom_count > 0:
|
|
996
|
+
self.console.print(
|
|
997
|
+
"\n [green]Custom agents (will be preserved):[/green]"
|
|
998
|
+
)
|
|
999
|
+
for agent in review_results["custom"]:
|
|
1000
|
+
self.console.print(f" ā {agent['name']} (v{agent['version']})")
|
|
1001
|
+
|
|
1002
|
+
# Show agents to be archived
|
|
1003
|
+
if unused_count > 0:
|
|
1004
|
+
self.console.print(
|
|
1005
|
+
"\n [yellow]Agents to archive (not needed for this toolchain):[/yellow]"
|
|
1006
|
+
)
|
|
1007
|
+
for agent in review_results["unused"]:
|
|
1008
|
+
reason = (
|
|
1009
|
+
f"outdated (v{agent['current_version']} ā v{agent['available_version']})"
|
|
1010
|
+
if "current_version" in agent
|
|
1011
|
+
else "not recommended"
|
|
1012
|
+
)
|
|
1013
|
+
self.console.print(f" ā {agent['name']} ({reason})")
|
|
1014
|
+
self.console.print(
|
|
1015
|
+
" [dim]Will be moved to .claude/agents/unused/[/dim]"
|
|
1016
|
+
)
|
|
1017
|
+
|
|
1018
|
+
def _show_restart_notification(
|
|
1019
|
+
self, agent_result=None, skills_result=None, archive_result=None
|
|
1020
|
+
) -> None:
|
|
1021
|
+
"""Show restart notification after configuration is complete.
|
|
1022
|
+
|
|
1023
|
+
Args:
|
|
1024
|
+
agent_result: Agent deployment results
|
|
1025
|
+
skills_result: Skills deployment results
|
|
1026
|
+
archive_result: Agent archival results
|
|
1027
|
+
"""
|
|
1028
|
+
if not self.console:
|
|
1029
|
+
return
|
|
1030
|
+
|
|
1031
|
+
# Build summary of changes
|
|
1032
|
+
changes = []
|
|
1033
|
+
if agent_result and agent_result.deployed_agents:
|
|
1034
|
+
changes.append(f"Deployed {len(agent_result.deployed_agents)} agent(s)")
|
|
1035
|
+
if skills_result and skills_result.get("deployed"):
|
|
1036
|
+
changes.append(f"Deployed {len(skills_result['deployed'])} skill(s)")
|
|
1037
|
+
if archive_result and archive_result.get("archived"):
|
|
1038
|
+
changes.append(
|
|
1039
|
+
f"Archived {len(archive_result['archived'])} unused agent(s) to .claude/agents/unused/"
|
|
1040
|
+
)
|
|
1041
|
+
|
|
1042
|
+
if changes:
|
|
1043
|
+
self.console.print("\n" + "=" * 70)
|
|
1044
|
+
self.console.print("ā
[bold green]Configuration complete![/bold green]")
|
|
1045
|
+
self.console.print(
|
|
1046
|
+
"\nš [bold yellow]Please restart Claude Code to apply changes:[/bold yellow]"
|
|
1047
|
+
)
|
|
1048
|
+
self.console.print(" - Quit Claude Code completely")
|
|
1049
|
+
self.console.print(" - Relaunch Claude Code")
|
|
1050
|
+
self.console.print("\n[bold]Changes applied:[/bold]")
|
|
1051
|
+
for change in changes:
|
|
1052
|
+
self.console.print(f" ⢠{change}")
|
|
1053
|
+
self.console.print("=" * 70 + "\n")
|