claude-mpm 3.4.10__py3-none-any.whl ā 5.4.55__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.
- claude_mpm/BUILD_NUMBER +1 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +290 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1402 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +90 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2503 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +2654 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1246 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +297 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1947 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +644 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1743 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +132 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +278 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +483 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +570 -0
- claude_mpm/core/unified_paths.py +941 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.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/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.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/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.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__/installer.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/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/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 +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +201 -107
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- 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 +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1369 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py ā agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py ā agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py ā agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py ā agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py ā agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py ā agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py ā agents/registry/modification_tracker.py} +370 -295
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1202 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py ā memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py ā memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py ā memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +707 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py ā project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1324 -0
- claude_mpm/services/skills/selective_skill_deployer.py +744 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1090 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +823 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.55.dist-info/METADATA +999 -0
- claude_mpm-5.4.55.dist-info/RECORD +868 -0
- {claude_mpm-3.4.10.dist-info ā claude_mpm-5.4.55.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.55.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.55.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info ā claude_mpm-5.4.55.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info ā claude_mpm-5.4.55.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,1053 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Auto-Configuration CLI Command for Claude MPM Framework
|
|
3
|
+
========================================================
|
|
4
|
+
|
|
5
|
+
WHY: This module provides a user-friendly CLI interface for the auto-configuration
|
|
6
|
+
feature, allowing users to automatically configure BOTH agents AND skills based on
|
|
7
|
+
detected toolchain.
|
|
8
|
+
|
|
9
|
+
DESIGN DECISION: Uses rich for beautiful terminal output, implements interactive
|
|
10
|
+
confirmation, and provides comprehensive error handling. Supports both interactive
|
|
11
|
+
and non-interactive modes for flexibility. Orchestrates both agent auto-config
|
|
12
|
+
(via AutoConfigManagerService) and skill recommendations (via SkillsDeployer).
|
|
13
|
+
|
|
14
|
+
Part of TSK-0054: Auto-Configuration Feature - Phase 5
|
|
15
|
+
Unified Auto-Configure: 1M-502 Phase 2
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import json
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Optional
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
from rich.console import Console
|
|
24
|
+
from rich.progress import BarColumn, Progress, SpinnerColumn, TextColumn
|
|
25
|
+
from rich.table import Table
|
|
26
|
+
|
|
27
|
+
RICH_AVAILABLE = True
|
|
28
|
+
except ImportError:
|
|
29
|
+
RICH_AVAILABLE = False
|
|
30
|
+
|
|
31
|
+
from ...core.enums import OperationResult
|
|
32
|
+
from ...services.agents.auto_config_manager import AutoConfigManagerService
|
|
33
|
+
from ...services.agents.observers import NullObserver
|
|
34
|
+
from ..shared import BaseCommand, CommandResult
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class RichProgressObserver(NullObserver):
|
|
38
|
+
"""
|
|
39
|
+
Observer that displays deployment progress using Rich.
|
|
40
|
+
|
|
41
|
+
WHY: Extends NullObserver to inherit all required abstract method
|
|
42
|
+
implementations while overriding only the methods needed for
|
|
43
|
+
Rich console output.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, console: "Console"):
|
|
47
|
+
"""Initialize the observer.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
console: Rich console for output
|
|
51
|
+
"""
|
|
52
|
+
self.console = console
|
|
53
|
+
self.progress = None
|
|
54
|
+
self.task_id = None
|
|
55
|
+
|
|
56
|
+
def on_agent_deployment_started(
|
|
57
|
+
self, agent_id: str, agent_name: str, index: int, total: int
|
|
58
|
+
) -> None:
|
|
59
|
+
"""Called when agent deployment starts."""
|
|
60
|
+
if not self.progress:
|
|
61
|
+
self.progress = Progress(
|
|
62
|
+
SpinnerColumn(),
|
|
63
|
+
TextColumn("[progress.description]{task.description}"),
|
|
64
|
+
BarColumn(),
|
|
65
|
+
TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
|
|
66
|
+
console=self.console,
|
|
67
|
+
)
|
|
68
|
+
self.progress.start()
|
|
69
|
+
|
|
70
|
+
self.task_id = self.progress.add_task(f"Deploying {agent_name}...", total=100)
|
|
71
|
+
|
|
72
|
+
def on_agent_deployment_progress(
|
|
73
|
+
self, agent_id: str, progress: int, message: str = ""
|
|
74
|
+
) -> None:
|
|
75
|
+
"""Called when deployment makes progress."""
|
|
76
|
+
if self.progress and self.task_id is not None:
|
|
77
|
+
self.progress.update(self.task_id, completed=progress)
|
|
78
|
+
|
|
79
|
+
def on_agent_deployment_completed(
|
|
80
|
+
self, agent_id: str, agent_name: str, success: bool, error: str | None = None
|
|
81
|
+
) -> None:
|
|
82
|
+
"""Called when agent deployment completes."""
|
|
83
|
+
if self.progress and self.task_id is not None:
|
|
84
|
+
if success:
|
|
85
|
+
self.progress.update(self.task_id, completed=100)
|
|
86
|
+
self.console.print(f"ā
{agent_name} deployed successfully")
|
|
87
|
+
else:
|
|
88
|
+
error_msg = f": {error}" if error else ""
|
|
89
|
+
self.console.print(f"ā {agent_name} deployment failed{error_msg}")
|
|
90
|
+
|
|
91
|
+
def on_deployment_completed(
|
|
92
|
+
self, success_count: int, failure_count: int, duration_ms: float
|
|
93
|
+
) -> None:
|
|
94
|
+
"""Called when all deployments complete."""
|
|
95
|
+
if self.progress:
|
|
96
|
+
self.progress.stop()
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class AutoConfigureCommand(BaseCommand):
|
|
100
|
+
"""
|
|
101
|
+
Handle auto-configuration CLI commands.
|
|
102
|
+
|
|
103
|
+
This command provides a user-friendly interface for automatically configuring
|
|
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)
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
def __init__(self):
|
|
112
|
+
"""Initialize the auto-configure command."""
|
|
113
|
+
super().__init__("auto-configure")
|
|
114
|
+
self.console = Console() if RICH_AVAILABLE else None
|
|
115
|
+
self._auto_config_manager = None
|
|
116
|
+
self._skills_deployer = None
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def auto_config_manager(self) -> AutoConfigManagerService:
|
|
120
|
+
"""Get auto-configuration manager (lazy loaded)."""
|
|
121
|
+
if self._auto_config_manager is None:
|
|
122
|
+
from ...services.agents.auto_config_manager import AutoConfigManagerService
|
|
123
|
+
from ...services.agents.recommender import AgentRecommenderService
|
|
124
|
+
from ...services.agents.registry import AgentRegistry
|
|
125
|
+
from ...services.project.toolchain_analyzer import ToolchainAnalyzerService
|
|
126
|
+
|
|
127
|
+
# Initialize services with dependency injection
|
|
128
|
+
toolchain_analyzer = ToolchainAnalyzerService()
|
|
129
|
+
agent_registry = AgentRegistry()
|
|
130
|
+
agent_recommender = AgentRecommenderService()
|
|
131
|
+
|
|
132
|
+
# Get deployment service
|
|
133
|
+
try:
|
|
134
|
+
from ...services.agents.deployment import AgentDeploymentService
|
|
135
|
+
|
|
136
|
+
agent_deployment = AgentDeploymentService()
|
|
137
|
+
except ImportError:
|
|
138
|
+
agent_deployment = None
|
|
139
|
+
|
|
140
|
+
self._auto_config_manager = AutoConfigManagerService(
|
|
141
|
+
toolchain_analyzer=toolchain_analyzer,
|
|
142
|
+
agent_recommender=agent_recommender,
|
|
143
|
+
agent_registry=agent_registry,
|
|
144
|
+
agent_deployment=agent_deployment,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return self._auto_config_manager
|
|
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
|
+
|
|
158
|
+
def validate_args(self, args) -> Optional[str]:
|
|
159
|
+
"""Validate command arguments."""
|
|
160
|
+
# Validate project path
|
|
161
|
+
project_path = (
|
|
162
|
+
Path(args.project_path)
|
|
163
|
+
if hasattr(args, "project_path") and args.project_path
|
|
164
|
+
else Path.cwd()
|
|
165
|
+
)
|
|
166
|
+
if not project_path.exists():
|
|
167
|
+
return f"Project path does not exist: {project_path}"
|
|
168
|
+
|
|
169
|
+
# Validate min_confidence range
|
|
170
|
+
if hasattr(args, "min_confidence") and args.min_confidence:
|
|
171
|
+
if not 0.0 <= args.min_confidence <= 1.0:
|
|
172
|
+
return "min_confidence must be between 0.0 and 1.0"
|
|
173
|
+
|
|
174
|
+
return None
|
|
175
|
+
|
|
176
|
+
def run(self, args) -> CommandResult:
|
|
177
|
+
"""
|
|
178
|
+
Execute auto-configuration command.
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
CommandResult with success status and exit code
|
|
182
|
+
"""
|
|
183
|
+
try:
|
|
184
|
+
# Setup logging
|
|
185
|
+
self.setup_logging(args)
|
|
186
|
+
|
|
187
|
+
# Validate arguments
|
|
188
|
+
error = self.validate_args(args)
|
|
189
|
+
if error:
|
|
190
|
+
return CommandResult.error_result(error)
|
|
191
|
+
|
|
192
|
+
# Get configuration options
|
|
193
|
+
project_path = (
|
|
194
|
+
Path(args.project_path)
|
|
195
|
+
if hasattr(args, "project_path") and args.project_path
|
|
196
|
+
else Path.cwd()
|
|
197
|
+
)
|
|
198
|
+
min_confidence = (
|
|
199
|
+
args.min_confidence
|
|
200
|
+
if hasattr(args, "min_confidence") and args.min_confidence
|
|
201
|
+
else 0.8
|
|
202
|
+
)
|
|
203
|
+
dry_run = (
|
|
204
|
+
args.preview or args.dry_run if hasattr(args, "preview") else False
|
|
205
|
+
)
|
|
206
|
+
skip_confirmation = args.yes if hasattr(args, "yes") and args.yes else False
|
|
207
|
+
json_output = args.json if hasattr(args, "json") and args.json else False
|
|
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
|
+
|
|
213
|
+
# Run preview or full configuration
|
|
214
|
+
if dry_run or args.preview if hasattr(args, "preview") else False:
|
|
215
|
+
return self._run_preview(
|
|
216
|
+
project_path,
|
|
217
|
+
min_confidence,
|
|
218
|
+
json_output,
|
|
219
|
+
configure_agents,
|
|
220
|
+
configure_skills,
|
|
221
|
+
)
|
|
222
|
+
return self._run_full_configuration(
|
|
223
|
+
project_path,
|
|
224
|
+
min_confidence,
|
|
225
|
+
skip_confirmation,
|
|
226
|
+
json_output,
|
|
227
|
+
configure_agents,
|
|
228
|
+
configure_skills,
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
except KeyboardInterrupt:
|
|
232
|
+
if self.console:
|
|
233
|
+
self.console.print("\n\nā Operation cancelled by user")
|
|
234
|
+
else:
|
|
235
|
+
print("\n\nOperation cancelled by user")
|
|
236
|
+
return CommandResult.error_result("Operation cancelled", exit_code=130)
|
|
237
|
+
|
|
238
|
+
except Exception as e:
|
|
239
|
+
self.logger.exception("Auto-configuration failed")
|
|
240
|
+
error_msg = f"Auto-configuration failed: {e!s}"
|
|
241
|
+
if self.console:
|
|
242
|
+
self.console.print(f"\nā {error_msg}")
|
|
243
|
+
else:
|
|
244
|
+
print(f"\n{error_msg}")
|
|
245
|
+
return CommandResult.error_result(error_msg)
|
|
246
|
+
|
|
247
|
+
def _run_preview(
|
|
248
|
+
self,
|
|
249
|
+
project_path: Path,
|
|
250
|
+
min_confidence: float,
|
|
251
|
+
json_output: bool,
|
|
252
|
+
configure_agents: bool = True,
|
|
253
|
+
configure_skills: bool = True,
|
|
254
|
+
) -> CommandResult:
|
|
255
|
+
"""Run configuration preview without deploying."""
|
|
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(
|
|
266
|
+
project_path, min_confidence
|
|
267
|
+
)
|
|
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)
|
|
286
|
+
|
|
287
|
+
# Output results
|
|
288
|
+
if json_output:
|
|
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
|
+
)
|
|
303
|
+
|
|
304
|
+
def _run_full_configuration(
|
|
305
|
+
self,
|
|
306
|
+
project_path: Path,
|
|
307
|
+
min_confidence: float,
|
|
308
|
+
skip_confirmation: bool,
|
|
309
|
+
json_output: bool,
|
|
310
|
+
configure_agents: bool = True,
|
|
311
|
+
configure_skills: bool = True,
|
|
312
|
+
) -> CommandResult:
|
|
313
|
+
"""Run full auto-configuration with deployment."""
|
|
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(
|
|
324
|
+
project_path, min_confidence
|
|
325
|
+
)
|
|
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)
|
|
344
|
+
|
|
345
|
+
# Display preview (unless JSON output)
|
|
346
|
+
if not json_output:
|
|
347
|
+
self._display_preview(
|
|
348
|
+
agent_preview,
|
|
349
|
+
skills_recommendations,
|
|
350
|
+
configure_agents,
|
|
351
|
+
configure_skills,
|
|
352
|
+
agent_review_results,
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
# Ask for confirmation (unless skipped)
|
|
356
|
+
if not skip_confirmation and not json_output:
|
|
357
|
+
if not self._confirm_deployment(
|
|
358
|
+
agent_preview,
|
|
359
|
+
skills_recommendations,
|
|
360
|
+
configure_agents,
|
|
361
|
+
configure_skills,
|
|
362
|
+
agent_review_results,
|
|
363
|
+
):
|
|
364
|
+
if self.console:
|
|
365
|
+
self.console.print("\nā Operation cancelled by user")
|
|
366
|
+
else:
|
|
367
|
+
print("\nOperation cancelled by user")
|
|
368
|
+
return CommandResult.error_result("Operation cancelled", exit_code=0)
|
|
369
|
+
|
|
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
|
+
)
|
|
395
|
+
)
|
|
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)
|
|
403
|
+
|
|
404
|
+
# Output results
|
|
405
|
+
if json_output:
|
|
406
|
+
return self._output_result_json(agent_result, skills_result, archive_result)
|
|
407
|
+
return self._display_result(agent_result, skills_result, archive_result)
|
|
408
|
+
|
|
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:
|
|
417
|
+
"""Display configuration preview with Rich formatting."""
|
|
418
|
+
if not self.console:
|
|
419
|
+
# Fallback to plain text
|
|
420
|
+
return self._display_preview_plain(
|
|
421
|
+
agent_preview,
|
|
422
|
+
skills_recommendations,
|
|
423
|
+
configure_agents,
|
|
424
|
+
configure_skills,
|
|
425
|
+
agent_review_results,
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
# Only show toolchain and agents if configuring agents
|
|
429
|
+
if not configure_agents:
|
|
430
|
+
agent_preview = None
|
|
431
|
+
|
|
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]")
|
|
506
|
+
|
|
507
|
+
return CommandResult.success_result()
|
|
508
|
+
|
|
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:
|
|
517
|
+
"""Display preview in plain text (fallback when Rich not available)."""
|
|
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}")
|
|
548
|
+
|
|
549
|
+
if configure_skills and skills_recommendations:
|
|
550
|
+
print("\nRecommended Skills:")
|
|
551
|
+
for skill in skills_recommendations:
|
|
552
|
+
print(f" - {skill}")
|
|
553
|
+
|
|
554
|
+
return CommandResult.success_result()
|
|
555
|
+
|
|
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:
|
|
564
|
+
"""Ask user to confirm deployment."""
|
|
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:
|
|
571
|
+
return False
|
|
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
|
+
|
|
582
|
+
if self.console:
|
|
583
|
+
self.console.print("\n" + "=" * 60)
|
|
584
|
+
self.console.print(message, style="bold yellow")
|
|
585
|
+
self.console.print("=" * 60)
|
|
586
|
+
response = (
|
|
587
|
+
self.console.input("\n[bold]Proceed? (y/n/s for select):[/bold] ")
|
|
588
|
+
.strip()
|
|
589
|
+
.lower()
|
|
590
|
+
)
|
|
591
|
+
else:
|
|
592
|
+
print("\n" + "=" * 60)
|
|
593
|
+
print(message)
|
|
594
|
+
print("=" * 60)
|
|
595
|
+
response = input("\nProceed? (y/n/s for select): ").strip().lower()
|
|
596
|
+
|
|
597
|
+
if response in ["y", "yes"]:
|
|
598
|
+
return True
|
|
599
|
+
if response in ["s", "select"]:
|
|
600
|
+
# TODO: Implement interactive selection
|
|
601
|
+
if self.console:
|
|
602
|
+
self.console.print(
|
|
603
|
+
"\nā ļø Interactive selection not yet implemented",
|
|
604
|
+
style="yellow",
|
|
605
|
+
)
|
|
606
|
+
else:
|
|
607
|
+
print("\nInteractive selection not yet implemented")
|
|
608
|
+
return False
|
|
609
|
+
return False
|
|
610
|
+
|
|
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:
|
|
617
|
+
"""Display configuration result."""
|
|
618
|
+
if not self.console:
|
|
619
|
+
return self._display_result_plain(
|
|
620
|
+
agent_result, skills_result, archive_result
|
|
621
|
+
)
|
|
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:
|
|
637
|
+
# Show deployed agents
|
|
638
|
+
if agent_result and agent_result.deployed_agents:
|
|
639
|
+
self.console.print("\nš¦ Deployed Agents:", style="bold green")
|
|
640
|
+
for agent_id in agent_result.deployed_agents:
|
|
641
|
+
self.console.print(f" ā {agent_id}")
|
|
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
|
+
|
|
658
|
+
return CommandResult.success_result()
|
|
659
|
+
|
|
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
|
|
667
|
+
|
|
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:
|
|
676
|
+
self.console.print("\nā Failed Agents:", style="bold red")
|
|
677
|
+
for agent_id in agent_result.failed_agents:
|
|
678
|
+
error = agent_result.errors.get(agent_id, "Unknown error")
|
|
679
|
+
self.console.print(f" ā {agent_id}: {error}")
|
|
680
|
+
|
|
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()
|
|
696
|
+
)
|
|
697
|
+
|
|
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:
|
|
704
|
+
"""Display result in plain text (fallback)."""
|
|
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:
|
|
715
|
+
print("\nā
Auto-configuration completed successfully!")
|
|
716
|
+
|
|
717
|
+
if agent_result and agent_result.deployed_agents:
|
|
718
|
+
print(f"Deployed {len(agent_result.deployed_agents)} agent(s)")
|
|
719
|
+
print("\nDeployed Agents:")
|
|
720
|
+
for agent_id in agent_result.deployed_agents:
|
|
721
|
+
print(f" - {agent_id}")
|
|
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
|
+
|
|
729
|
+
return CommandResult.success_result()
|
|
730
|
+
|
|
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
|
+
)
|
|
743
|
+
|
|
744
|
+
if agent_result.failed_agents:
|
|
745
|
+
print("\nFailed Agents:")
|
|
746
|
+
for agent_id in agent_result.failed_agents:
|
|
747
|
+
error = agent_result.errors.get(agent_id, "Unknown error")
|
|
748
|
+
print(f" - {agent_id}: {error}")
|
|
749
|
+
|
|
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
|
+
)
|
|
766
|
+
|
|
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:
|
|
775
|
+
"""Output preview as JSON."""
|
|
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
|
+
}
|
|
834
|
+
|
|
835
|
+
print(json.dumps(output, indent=2))
|
|
836
|
+
return CommandResult.success_result(data=output)
|
|
837
|
+
|
|
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:
|
|
844
|
+
"""Output result as JSON."""
|
|
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
|
|
861
|
+
|
|
862
|
+
print(json.dumps(output, indent=2))
|
|
863
|
+
|
|
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:
|
|
872
|
+
return CommandResult.success_result(data=output)
|
|
873
|
+
return CommandResult.error_result(
|
|
874
|
+
"Configuration failed or partial", exit_code=1, data=output
|
|
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")
|