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,446 @@
|
|
|
1
|
+
"""Service for deploying MPM slash commands to user's Claude configuration.
|
|
2
|
+
|
|
3
|
+
This service handles:
|
|
4
|
+
1. Copying command markdown files from source to user's ~/.claude/commands directory
|
|
5
|
+
2. Creating the commands directory if it doesn't exist
|
|
6
|
+
3. Overwriting existing commands to ensure they're up-to-date
|
|
7
|
+
4. Parsing and validating YAML frontmatter for namespace metadata (Phase 1 - 1M-400)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
12
|
+
|
|
13
|
+
import yaml
|
|
14
|
+
|
|
15
|
+
from claude_mpm.core.base_service import BaseService
|
|
16
|
+
from claude_mpm.core.logger import get_logger
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CommandDeploymentService(BaseService):
|
|
20
|
+
"""Service for deploying MPM slash commands."""
|
|
21
|
+
|
|
22
|
+
# Deprecated commands that have been replaced (cleanup on startup)
|
|
23
|
+
DEPRECATED_COMMANDS = [
|
|
24
|
+
"mpm-agents.md", # Replaced by mpm-agents-list.md
|
|
25
|
+
"mpm-auto-configure.md", # Replaced by mpm-agents-auto-configure.md
|
|
26
|
+
"mpm-config-view.md", # Replaced by mpm-config.md
|
|
27
|
+
"mpm-resume.md", # Replaced by mpm-session-resume.md
|
|
28
|
+
"mpm-ticket.md", # Replaced by mpm-ticket-view.md
|
|
29
|
+
# Removed - consolidated into /mpm-configure
|
|
30
|
+
"mpm-agents-list.md", # Consolidated into /mpm-configure
|
|
31
|
+
"mpm-agents-detect.md", # Consolidated into /mpm-configure
|
|
32
|
+
"mpm-agents-auto-configure.md", # Consolidated into /mpm-configure
|
|
33
|
+
"mpm-agents-recommend.md", # Consolidated into /mpm-configure
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
def __init__(self):
|
|
37
|
+
"""Initialize the command deployment service."""
|
|
38
|
+
super().__init__(name="command_deployment")
|
|
39
|
+
|
|
40
|
+
# Source commands directory in the package - use proper resource resolution
|
|
41
|
+
try:
|
|
42
|
+
from ..core.unified_paths import get_package_resource_path
|
|
43
|
+
|
|
44
|
+
self.source_dir = get_package_resource_path("commands")
|
|
45
|
+
except FileNotFoundError:
|
|
46
|
+
# Fallback to old method for development environments
|
|
47
|
+
self.source_dir = Path(__file__).parent.parent / "commands"
|
|
48
|
+
|
|
49
|
+
# Target directory in user's home
|
|
50
|
+
self.target_dir = Path.home() / ".claude" / "commands"
|
|
51
|
+
|
|
52
|
+
async def _initialize(self) -> None:
|
|
53
|
+
"""Initialize the service."""
|
|
54
|
+
|
|
55
|
+
async def _cleanup(self) -> None:
|
|
56
|
+
"""Cleanup service resources."""
|
|
57
|
+
|
|
58
|
+
def _parse_frontmatter(self, content: str) -> Tuple[Optional[Dict[str, Any]], str]:
|
|
59
|
+
"""Parse YAML frontmatter from command file.
|
|
60
|
+
|
|
61
|
+
Ticket: 1M-400 Phase 1 - Enhanced Flat Naming with Namespace Metadata
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
content: Command file content
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Tuple of (frontmatter_dict, content_without_frontmatter)
|
|
68
|
+
If no frontmatter found, returns (None, original_content)
|
|
69
|
+
"""
|
|
70
|
+
if not content.startswith("---\n"):
|
|
71
|
+
return None, content
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
# Split on closing ---
|
|
75
|
+
parts = content.split("\n---\n", 1)
|
|
76
|
+
if len(parts) != 2:
|
|
77
|
+
return None, content
|
|
78
|
+
|
|
79
|
+
frontmatter_str = parts[0].replace("---\n", "", 1)
|
|
80
|
+
body = parts[1]
|
|
81
|
+
|
|
82
|
+
frontmatter = yaml.safe_load(frontmatter_str)
|
|
83
|
+
return frontmatter, body
|
|
84
|
+
except yaml.YAMLError as e:
|
|
85
|
+
self.logger.warning(f"YAML parsing error: {e}")
|
|
86
|
+
return None, content
|
|
87
|
+
|
|
88
|
+
def _validate_frontmatter(
|
|
89
|
+
self, frontmatter: Dict[str, Any], filepath: Path
|
|
90
|
+
) -> List[str]:
|
|
91
|
+
"""Validate frontmatter schema.
|
|
92
|
+
|
|
93
|
+
Ticket: 1M-400 Phase 1 - Enhanced Flat Naming with Namespace Metadata
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
frontmatter: Parsed frontmatter dictionary
|
|
97
|
+
filepath: Path to command file (for error reporting)
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
List of validation errors (empty if valid)
|
|
101
|
+
"""
|
|
102
|
+
errors = []
|
|
103
|
+
required_fields = ["namespace", "command", "category", "description"]
|
|
104
|
+
|
|
105
|
+
for field in required_fields:
|
|
106
|
+
if field not in frontmatter:
|
|
107
|
+
errors.append(f"Missing required field: {field}")
|
|
108
|
+
|
|
109
|
+
# Validate category
|
|
110
|
+
valid_categories = ["agents", "config", "tickets", "session", "system"]
|
|
111
|
+
if (
|
|
112
|
+
"category" in frontmatter
|
|
113
|
+
and frontmatter["category"] not in valid_categories
|
|
114
|
+
):
|
|
115
|
+
errors.append(
|
|
116
|
+
f"Invalid category: {frontmatter['category']} "
|
|
117
|
+
f"(must be one of {valid_categories})"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Validate data types
|
|
121
|
+
if "aliases" in frontmatter and not isinstance(frontmatter["aliases"], list):
|
|
122
|
+
errors.append("Field 'aliases' must be a list")
|
|
123
|
+
|
|
124
|
+
if "deprecated_aliases" in frontmatter and not isinstance(
|
|
125
|
+
frontmatter["deprecated_aliases"], list
|
|
126
|
+
):
|
|
127
|
+
errors.append("Field 'deprecated_aliases' must be a list")
|
|
128
|
+
|
|
129
|
+
return errors
|
|
130
|
+
|
|
131
|
+
def _strip_deprecated_aliases(self, content: str) -> str:
|
|
132
|
+
"""Strip deprecated_aliases from frontmatter to hide them from Claude Code UI.
|
|
133
|
+
|
|
134
|
+
This prevents deprecated aliases from appearing in the command list while
|
|
135
|
+
maintaining backward compatibility through command routing.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
content: Command file content with frontmatter
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
Content with deprecated_aliases removed from frontmatter
|
|
142
|
+
"""
|
|
143
|
+
frontmatter, body = self._parse_frontmatter(content)
|
|
144
|
+
|
|
145
|
+
if not frontmatter or "deprecated_aliases" not in frontmatter:
|
|
146
|
+
return content
|
|
147
|
+
|
|
148
|
+
# Remove deprecated_aliases from frontmatter
|
|
149
|
+
frontmatter_copy = frontmatter.copy()
|
|
150
|
+
del frontmatter_copy["deprecated_aliases"]
|
|
151
|
+
|
|
152
|
+
# Reconstruct the file with modified frontmatter
|
|
153
|
+
frontmatter_yaml = yaml.dump(
|
|
154
|
+
frontmatter_copy, default_flow_style=False, sort_keys=False
|
|
155
|
+
)
|
|
156
|
+
return f"---\n{frontmatter_yaml}---\n{body}"
|
|
157
|
+
|
|
158
|
+
def deploy_commands(self, force: bool = False) -> Dict[str, Any]:
|
|
159
|
+
"""Deploy MPM slash commands to user's Claude configuration.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
force: Force deployment even if files exist
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
Dictionary with deployment results
|
|
166
|
+
"""
|
|
167
|
+
result = {
|
|
168
|
+
"success": False,
|
|
169
|
+
"deployed": [],
|
|
170
|
+
"errors": [],
|
|
171
|
+
"target_dir": str(self.target_dir),
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
try:
|
|
175
|
+
# Check if source directory exists
|
|
176
|
+
if not self.source_dir.exists():
|
|
177
|
+
self.logger.warning(
|
|
178
|
+
f"Source commands directory not found: {self.source_dir}"
|
|
179
|
+
)
|
|
180
|
+
result["errors"].append(
|
|
181
|
+
f"Source directory not found: {self.source_dir}"
|
|
182
|
+
)
|
|
183
|
+
return result
|
|
184
|
+
|
|
185
|
+
# Create target directory if it doesn't exist
|
|
186
|
+
self.target_dir.mkdir(parents=True, exist_ok=True)
|
|
187
|
+
self.logger.debug(f"Ensured target directory exists: {self.target_dir}")
|
|
188
|
+
|
|
189
|
+
# Get all .md files from source directory
|
|
190
|
+
command_files = list(self.source_dir.glob("*.md"))
|
|
191
|
+
|
|
192
|
+
if not command_files:
|
|
193
|
+
self.logger.info("No command files found to deploy")
|
|
194
|
+
result["success"] = True
|
|
195
|
+
return result
|
|
196
|
+
|
|
197
|
+
# Deploy each command file
|
|
198
|
+
for source_file in command_files:
|
|
199
|
+
target_file = self.target_dir / source_file.name
|
|
200
|
+
|
|
201
|
+
try:
|
|
202
|
+
# Validate frontmatter if present (1M-400 Phase 1)
|
|
203
|
+
content = source_file.read_text()
|
|
204
|
+
frontmatter, _ = self._parse_frontmatter(content)
|
|
205
|
+
|
|
206
|
+
if frontmatter:
|
|
207
|
+
validation_errors = self._validate_frontmatter(
|
|
208
|
+
frontmatter, source_file
|
|
209
|
+
)
|
|
210
|
+
if validation_errors:
|
|
211
|
+
self.logger.warning(
|
|
212
|
+
f"Frontmatter validation issues in {source_file.name}: "
|
|
213
|
+
f"{'; '.join(validation_errors)}"
|
|
214
|
+
)
|
|
215
|
+
# Continue deployment but log warnings
|
|
216
|
+
|
|
217
|
+
# Check if file exists and if we should overwrite
|
|
218
|
+
if (
|
|
219
|
+
target_file.exists()
|
|
220
|
+
and not force
|
|
221
|
+
and source_file.stat().st_mtime <= target_file.stat().st_mtime
|
|
222
|
+
):
|
|
223
|
+
self.logger.debug(
|
|
224
|
+
f"Skipping {source_file.name} - target is up to date"
|
|
225
|
+
)
|
|
226
|
+
continue
|
|
227
|
+
|
|
228
|
+
# Strip deprecated_aliases from content before deployment
|
|
229
|
+
# This prevents them from appearing in Claude Code's command list UI
|
|
230
|
+
cleaned_content = self._strip_deprecated_aliases(content)
|
|
231
|
+
|
|
232
|
+
# Write the cleaned content to target
|
|
233
|
+
target_file.write_text(cleaned_content)
|
|
234
|
+
self.logger.info(f"Deployed command: {source_file.name}")
|
|
235
|
+
result["deployed"].append(source_file.name)
|
|
236
|
+
|
|
237
|
+
except Exception as e:
|
|
238
|
+
error_msg = f"Failed to deploy {source_file.name}: {e}"
|
|
239
|
+
self.logger.error(error_msg)
|
|
240
|
+
result["errors"].append(error_msg)
|
|
241
|
+
|
|
242
|
+
result["success"] = len(result["errors"]) == 0
|
|
243
|
+
|
|
244
|
+
if result["deployed"]:
|
|
245
|
+
self.logger.info(
|
|
246
|
+
f"Successfully deployed {len(result['deployed'])} commands to {self.target_dir}"
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
return result
|
|
250
|
+
|
|
251
|
+
except Exception as e:
|
|
252
|
+
error_msg = f"Command deployment failed: {e}"
|
|
253
|
+
self.logger.error(error_msg)
|
|
254
|
+
result["errors"].append(error_msg)
|
|
255
|
+
return result
|
|
256
|
+
|
|
257
|
+
def list_available_commands(self) -> List[str]:
|
|
258
|
+
"""List available commands in the source directory.
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
List of command file names
|
|
262
|
+
"""
|
|
263
|
+
if not self.source_dir.exists():
|
|
264
|
+
return []
|
|
265
|
+
|
|
266
|
+
return [f.name for f in self.source_dir.glob("*.md")]
|
|
267
|
+
|
|
268
|
+
def list_deployed_commands(self) -> List[str]:
|
|
269
|
+
"""List deployed commands in the target directory.
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
List of deployed command file names
|
|
273
|
+
"""
|
|
274
|
+
if not self.target_dir.exists():
|
|
275
|
+
return []
|
|
276
|
+
|
|
277
|
+
return [f.name for f in self.target_dir.glob("mpm*.md")]
|
|
278
|
+
|
|
279
|
+
def remove_deployed_commands(self) -> int:
|
|
280
|
+
"""Remove all deployed MPM commands from target directory.
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
Number of files removed
|
|
284
|
+
"""
|
|
285
|
+
if not self.target_dir.exists():
|
|
286
|
+
return 0
|
|
287
|
+
|
|
288
|
+
removed = 0
|
|
289
|
+
for file in self.target_dir.glob("mpm*.md"):
|
|
290
|
+
try:
|
|
291
|
+
file.unlink()
|
|
292
|
+
self.logger.info(f"Removed command: {file.name}")
|
|
293
|
+
removed += 1
|
|
294
|
+
except Exception as e:
|
|
295
|
+
self.logger.error(f"Failed to remove {file.name}: {e}")
|
|
296
|
+
|
|
297
|
+
return removed
|
|
298
|
+
|
|
299
|
+
def remove_deprecated_commands(self) -> int:
|
|
300
|
+
"""Remove deprecated MPM commands that have been replaced.
|
|
301
|
+
|
|
302
|
+
This method cleans up old command files that have been superseded by
|
|
303
|
+
new hierarchical command names. It's called automatically on startup
|
|
304
|
+
to ensure users don't have both old and new versions.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
Number of deprecated files removed
|
|
308
|
+
"""
|
|
309
|
+
if not self.target_dir.exists():
|
|
310
|
+
self.logger.debug(
|
|
311
|
+
f"Target directory does not exist: {self.target_dir}, skipping deprecated command cleanup"
|
|
312
|
+
)
|
|
313
|
+
return 0
|
|
314
|
+
|
|
315
|
+
removed = 0
|
|
316
|
+
self.logger.info("Cleaning up deprecated commands...")
|
|
317
|
+
|
|
318
|
+
# Mapping of deprecated commands to their replacements for informative logging
|
|
319
|
+
replacement_map = {
|
|
320
|
+
"mpm-agents.md": "mpm-agents-list.md",
|
|
321
|
+
"mpm-auto-configure.md": "mpm-agents-auto-configure.md",
|
|
322
|
+
"mpm-config-view.md": "mpm-config.md",
|
|
323
|
+
"mpm-resume.md": "mpm-session-resume.md",
|
|
324
|
+
"mpm-ticket.md": "mpm-ticket-view.md",
|
|
325
|
+
# Removed commands - consolidated into /mpm-configure
|
|
326
|
+
"mpm-agents-list.md": "mpm-configure (use /mpm-configure)",
|
|
327
|
+
"mpm-agents-detect.md": "mpm-configure (use /mpm-configure)",
|
|
328
|
+
"mpm-agents-auto-configure.md": "mpm-configure (use /mpm-configure)",
|
|
329
|
+
"mpm-agents-recommend.md": "mpm-configure (use /mpm-configure)",
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
for deprecated_cmd in self.DEPRECATED_COMMANDS:
|
|
333
|
+
deprecated_file = self.target_dir / deprecated_cmd
|
|
334
|
+
replacement = replacement_map.get(deprecated_cmd, "a newer command")
|
|
335
|
+
|
|
336
|
+
if deprecated_file.exists():
|
|
337
|
+
try:
|
|
338
|
+
deprecated_file.unlink()
|
|
339
|
+
self.logger.debug(
|
|
340
|
+
f"Removed deprecated command: {deprecated_cmd} (replaced by {replacement})"
|
|
341
|
+
)
|
|
342
|
+
removed += 1
|
|
343
|
+
except Exception as e:
|
|
344
|
+
# Log error but don't fail startup - this is non-critical
|
|
345
|
+
self.logger.warning(
|
|
346
|
+
f"Failed to remove deprecated command {deprecated_cmd}: {e}"
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
if removed > 0:
|
|
350
|
+
self.logger.info(f"Removed {removed} deprecated command(s)")
|
|
351
|
+
else:
|
|
352
|
+
self.logger.debug("No deprecated commands found to remove")
|
|
353
|
+
|
|
354
|
+
return removed
|
|
355
|
+
|
|
356
|
+
def remove_stale_commands(self) -> int:
|
|
357
|
+
"""Remove stale MPM commands that no longer exist in source.
|
|
358
|
+
|
|
359
|
+
This method cleans up deployed commands that have been deleted or renamed
|
|
360
|
+
in the source directory. It's called automatically on startup to ensure
|
|
361
|
+
deployed commands stay in sync with source.
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
Number of stale files removed
|
|
365
|
+
"""
|
|
366
|
+
if not self.target_dir.exists():
|
|
367
|
+
self.logger.debug(
|
|
368
|
+
f"Target directory does not exist: {self.target_dir}, skipping stale command cleanup"
|
|
369
|
+
)
|
|
370
|
+
return 0
|
|
371
|
+
|
|
372
|
+
if not self.source_dir.exists():
|
|
373
|
+
self.logger.warning(
|
|
374
|
+
f"Source directory does not exist: {self.source_dir}, cannot detect stale commands"
|
|
375
|
+
)
|
|
376
|
+
return 0
|
|
377
|
+
|
|
378
|
+
# Get current source commands (ground truth)
|
|
379
|
+
source_commands = {f.name for f in self.source_dir.glob("mpm*.md")}
|
|
380
|
+
|
|
381
|
+
# Get deployed commands
|
|
382
|
+
deployed_commands = {f.name for f in self.target_dir.glob("mpm*.md")}
|
|
383
|
+
|
|
384
|
+
# Find stale commands (deployed but not in source, excluding deprecated)
|
|
385
|
+
stale_commands = (
|
|
386
|
+
deployed_commands - source_commands - set(self.DEPRECATED_COMMANDS)
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
if not stale_commands:
|
|
390
|
+
self.logger.debug("No stale commands found to remove")
|
|
391
|
+
return 0
|
|
392
|
+
|
|
393
|
+
removed = 0
|
|
394
|
+
self.logger.info(f"Cleaning up {len(stale_commands)} stale command(s)...")
|
|
395
|
+
|
|
396
|
+
for stale_cmd in stale_commands:
|
|
397
|
+
stale_file = self.target_dir / stale_cmd
|
|
398
|
+
try:
|
|
399
|
+
stale_file.unlink()
|
|
400
|
+
self.logger.info(
|
|
401
|
+
f"Removed stale command: {stale_cmd} (no longer in source)"
|
|
402
|
+
)
|
|
403
|
+
removed += 1
|
|
404
|
+
except Exception as e:
|
|
405
|
+
# Log error but don't fail startup - this is non-critical
|
|
406
|
+
self.logger.warning(f"Failed to remove stale command {stale_cmd}: {e}")
|
|
407
|
+
|
|
408
|
+
if removed > 0:
|
|
409
|
+
self.logger.info(f"Removed {removed} stale command(s)")
|
|
410
|
+
|
|
411
|
+
return removed
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def deploy_commands_on_startup(force: bool = False) -> None:
|
|
415
|
+
"""Convenience function to deploy commands during startup.
|
|
416
|
+
|
|
417
|
+
This function:
|
|
418
|
+
1. Removes deprecated commands that have been replaced
|
|
419
|
+
2. Removes stale commands that no longer exist in source
|
|
420
|
+
3. Deploys current command files
|
|
421
|
+
|
|
422
|
+
Args:
|
|
423
|
+
force: Force deployment even if files exist
|
|
424
|
+
"""
|
|
425
|
+
service = CommandDeploymentService()
|
|
426
|
+
logger = get_logger("startup")
|
|
427
|
+
|
|
428
|
+
# Clean up deprecated commands FIRST (known old commands)
|
|
429
|
+
deprecated_count = service.remove_deprecated_commands()
|
|
430
|
+
if deprecated_count > 0:
|
|
431
|
+
logger.info(f"Cleaned up {deprecated_count} deprecated command(s)")
|
|
432
|
+
|
|
433
|
+
# Clean up stale commands SECOND (deployed but not in source anymore)
|
|
434
|
+
stale_count = service.remove_stale_commands()
|
|
435
|
+
if stale_count > 0:
|
|
436
|
+
logger.info(f"Cleaned up {stale_count} stale command(s)")
|
|
437
|
+
|
|
438
|
+
# Deploy current commands LAST
|
|
439
|
+
result = service.deploy_commands(force=force)
|
|
440
|
+
|
|
441
|
+
if result["deployed"]:
|
|
442
|
+
logger.info(f"MPM commands deployed: {', '.join(result['deployed'])}")
|
|
443
|
+
|
|
444
|
+
if result["errors"]:
|
|
445
|
+
for error in result["errors"]:
|
|
446
|
+
logger.warning(f"Command deployment issue: {error}")
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"""Command handler service for processing MPM commands.
|
|
2
|
+
|
|
3
|
+
This service handles:
|
|
4
|
+
1. MPM command parsing and validation
|
|
5
|
+
2. Command execution and routing
|
|
6
|
+
3. Command logging and error handling
|
|
7
|
+
4. Integration with CLI modules
|
|
8
|
+
|
|
9
|
+
Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from typing import Any, Dict, List
|
|
13
|
+
|
|
14
|
+
from claude_mpm.core.base_service import BaseService
|
|
15
|
+
from claude_mpm.core.enums import OperationResult
|
|
16
|
+
from claude_mpm.services.core.interfaces import CommandHandlerInterface
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CommandHandlerService(BaseService, CommandHandlerInterface):
|
|
20
|
+
"""Service for handling MPM commands."""
|
|
21
|
+
|
|
22
|
+
def __init__(self, project_logger=None):
|
|
23
|
+
"""Initialize the command handler service.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
project_logger: Optional project logger for command logging
|
|
27
|
+
"""
|
|
28
|
+
super().__init__(name="command_handler_service")
|
|
29
|
+
self.project_logger = project_logger
|
|
30
|
+
|
|
31
|
+
async def _initialize(self) -> None:
|
|
32
|
+
"""Initialize the service. No special initialization needed."""
|
|
33
|
+
|
|
34
|
+
async def _cleanup(self) -> None:
|
|
35
|
+
"""Cleanup service resources. No cleanup needed."""
|
|
36
|
+
|
|
37
|
+
def handle_mpm_command(self, prompt: str) -> bool:
|
|
38
|
+
"""Handle /mpm: commands directly without going to Claude.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
prompt: The full prompt starting with "/mpm:"
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
bool: True if command was handled successfully, False otherwise
|
|
45
|
+
"""
|
|
46
|
+
try:
|
|
47
|
+
# Extract command and arguments
|
|
48
|
+
command_line = prompt[5:].strip() # Remove "/mpm:"
|
|
49
|
+
parts = command_line.split()
|
|
50
|
+
|
|
51
|
+
if not parts:
|
|
52
|
+
print("No command specified. Available commands: test, agents")
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
command = parts[0]
|
|
56
|
+
args = parts[1:]
|
|
57
|
+
|
|
58
|
+
# Route to appropriate handler
|
|
59
|
+
if command == "test":
|
|
60
|
+
return self._handle_test_command(args)
|
|
61
|
+
if command == "agents":
|
|
62
|
+
return self._handle_agents_command(args)
|
|
63
|
+
print(f"Unknown command: {command}")
|
|
64
|
+
print("Available commands: test, agents")
|
|
65
|
+
return True
|
|
66
|
+
|
|
67
|
+
except KeyboardInterrupt:
|
|
68
|
+
print("\nCommand interrupted")
|
|
69
|
+
return False
|
|
70
|
+
except Exception as e:
|
|
71
|
+
print(f"Error executing command: {e}")
|
|
72
|
+
self._log_command_error(f"Failed to execute /mpm: command: {e}")
|
|
73
|
+
return False
|
|
74
|
+
|
|
75
|
+
def _handle_test_command(self, args: list) -> bool:
|
|
76
|
+
"""Handle the test command.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
args: Command arguments
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
bool: True if successful
|
|
83
|
+
"""
|
|
84
|
+
print("Hello World")
|
|
85
|
+
self._log_command_success("Executed /mpm:test command")
|
|
86
|
+
return True
|
|
87
|
+
|
|
88
|
+
def _handle_agents_command(self, args: list) -> bool:
|
|
89
|
+
"""Handle the agents command - display deployed agent versions.
|
|
90
|
+
|
|
91
|
+
WHY: This provides users with a quick way to check deployed agent versions
|
|
92
|
+
directly from within Claude Code, maintaining consistency with CLI behavior.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
args: Command arguments
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
bool: True if successful, False if error occurred
|
|
99
|
+
"""
|
|
100
|
+
try:
|
|
101
|
+
from claude_mpm.cli import _get_agent_versions_display
|
|
102
|
+
|
|
103
|
+
agent_versions = _get_agent_versions_display()
|
|
104
|
+
if agent_versions:
|
|
105
|
+
print(agent_versions)
|
|
106
|
+
else:
|
|
107
|
+
print("No deployed agents found")
|
|
108
|
+
print("\nTo deploy agents, run: claude-mpm --mpm:agents deploy")
|
|
109
|
+
|
|
110
|
+
self._log_command_success("Executed /mpm:agents command")
|
|
111
|
+
return True
|
|
112
|
+
|
|
113
|
+
except ImportError as e:
|
|
114
|
+
print(f"Error: CLI module not available: {e}")
|
|
115
|
+
return False
|
|
116
|
+
except Exception as e:
|
|
117
|
+
print(f"Error getting agent versions: {e}")
|
|
118
|
+
return False
|
|
119
|
+
|
|
120
|
+
def _log_command_success(self, message: str):
|
|
121
|
+
"""Log successful command execution.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
message: Success message to log
|
|
125
|
+
"""
|
|
126
|
+
if self.project_logger:
|
|
127
|
+
self.project_logger.log_system(message, level="INFO", component="command")
|
|
128
|
+
|
|
129
|
+
def _log_command_error(self, message: str):
|
|
130
|
+
"""Log command execution error.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
message: Error message to log
|
|
134
|
+
"""
|
|
135
|
+
if self.project_logger:
|
|
136
|
+
self.project_logger.log_system(message, level="ERROR", component="command")
|
|
137
|
+
|
|
138
|
+
def is_mpm_command(self, prompt: str) -> bool:
|
|
139
|
+
"""Check if a prompt is an MPM command.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
prompt: The prompt to check
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
bool: True if the prompt is an MPM command
|
|
146
|
+
"""
|
|
147
|
+
return prompt.strip().startswith("/mpm:")
|
|
148
|
+
|
|
149
|
+
def get_available_commands(self) -> List[str]:
|
|
150
|
+
"""Get list of available MPM commands.
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
List: List of available command names
|
|
154
|
+
"""
|
|
155
|
+
return ["test", "agents"]
|
|
156
|
+
|
|
157
|
+
# Implementation of abstract methods from CommandHandlerInterface
|
|
158
|
+
|
|
159
|
+
def handle_command(self, command: str, args: List[str]) -> Dict[str, Any]:
|
|
160
|
+
"""Handle an MPM command.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
command: Command name to execute
|
|
164
|
+
args: Command arguments
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Dictionary with command execution results
|
|
168
|
+
"""
|
|
169
|
+
try:
|
|
170
|
+
if command == "test":
|
|
171
|
+
success = self._handle_test_command(args)
|
|
172
|
+
return {
|
|
173
|
+
OperationResult.SUCCESS.value: success,
|
|
174
|
+
"command": command,
|
|
175
|
+
"args": args,
|
|
176
|
+
"message": (
|
|
177
|
+
"Test command executed" if success else "Test command failed"
|
|
178
|
+
),
|
|
179
|
+
}
|
|
180
|
+
if command == "agents":
|
|
181
|
+
success = self._handle_agents_command(args)
|
|
182
|
+
return {
|
|
183
|
+
OperationResult.SUCCESS.value: success,
|
|
184
|
+
"command": command,
|
|
185
|
+
"args": args,
|
|
186
|
+
"message": (
|
|
187
|
+
"Agents command executed"
|
|
188
|
+
if success
|
|
189
|
+
else "Agents command failed"
|
|
190
|
+
),
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
OperationResult.SUCCESS.value: False,
|
|
194
|
+
"command": command,
|
|
195
|
+
"args": args,
|
|
196
|
+
OperationResult.ERROR.value: f"Unknown command: {command}",
|
|
197
|
+
"available_commands": self.get_available_commands(),
|
|
198
|
+
}
|
|
199
|
+
except Exception as e:
|
|
200
|
+
return {
|
|
201
|
+
OperationResult.SUCCESS.value: False,
|
|
202
|
+
"command": command,
|
|
203
|
+
"args": args,
|
|
204
|
+
OperationResult.ERROR.value: str(e),
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
def get_command_help(self, command: str) -> str:
|
|
208
|
+
"""Get help text for a specific command.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
command: Command name
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Help text for the command
|
|
215
|
+
"""
|
|
216
|
+
help_text = {
|
|
217
|
+
"test": "Test command - prints 'Hello World' to verify MPM command functionality",
|
|
218
|
+
"agents": "Agents command - displays information about deployed agents and their versions",
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return help_text.get(command, f"No help available for command: {command}")
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Communication Services Module
|
|
3
|
+
============================
|
|
4
|
+
|
|
5
|
+
This module contains all communication-related services including
|
|
6
|
+
SocketIO server and WebSocket utilities.
|
|
7
|
+
|
|
8
|
+
Part of TSK-0046: Service Layer Architecture Reorganization
|
|
9
|
+
|
|
10
|
+
Services:
|
|
11
|
+
- SocketIOServer: Main SocketIO server for real-time communication
|
|
12
|
+
- WebSocketClientManager: WebSocket client management utilities
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from .socketio import SocketIOServer
|
|
16
|
+
|
|
17
|
+
# from .websocket import SocketIOClientManager # Module has import issues
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"SocketIOServer",
|
|
21
|
+
# 'SocketIOClientManager',
|
|
22
|
+
]
|