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,349 @@
|
|
|
1
|
+
"""Monitor UI Build Tracking Service.
|
|
2
|
+
|
|
3
|
+
WHY: The Monitor UI needs its own build tracking separate from the main MPM build
|
|
4
|
+
number to track UI-specific changes and deployments independently.
|
|
5
|
+
|
|
6
|
+
DESIGN DECISION:
|
|
7
|
+
- Uses atomic file operations for thread-safe build number management
|
|
8
|
+
- Stores build number in MONITOR_BUILD file at project root
|
|
9
|
+
- Formats as 4-digit zero-padded strings (0001, 0002, etc.)
|
|
10
|
+
- Provides both sync and async interfaces for flexibility
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import json
|
|
15
|
+
import os
|
|
16
|
+
import tempfile
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any, Dict, Optional
|
|
19
|
+
|
|
20
|
+
from claude_mpm.core.base_service import BaseService
|
|
21
|
+
from claude_mpm.core.logger import get_logger
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class MonitorBuildService(BaseService):
|
|
25
|
+
"""Service for managing Monitor UI build numbers.
|
|
26
|
+
|
|
27
|
+
WHY: Separate build tracking allows the Monitor UI to evolve independently
|
|
28
|
+
of the main MPM framework, enabling rapid UI iterations without affecting
|
|
29
|
+
core framework versioning.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
# Default values
|
|
33
|
+
DEFAULT_BUILD_NUMBER = 1
|
|
34
|
+
DEFAULT_VERSION = "1.0.0"
|
|
35
|
+
BUILD_FILE_NAME = "MONITOR_BUILD"
|
|
36
|
+
|
|
37
|
+
def __init__(self):
|
|
38
|
+
"""Initialize the monitor build service."""
|
|
39
|
+
super().__init__(name="monitor_build_service")
|
|
40
|
+
self.logger = get_logger(self.__class__.__name__)
|
|
41
|
+
|
|
42
|
+
# Determine build file location
|
|
43
|
+
self._build_file_path = self._get_build_file_path()
|
|
44
|
+
|
|
45
|
+
# Cache for build info to reduce file I/O
|
|
46
|
+
self._cached_build_info: Optional[Dict[str, Any]] = None
|
|
47
|
+
self._cache_lock = asyncio.Lock()
|
|
48
|
+
|
|
49
|
+
def _get_build_file_path(self) -> Path:
|
|
50
|
+
"""Get the path to the MONITOR_BUILD file.
|
|
51
|
+
|
|
52
|
+
WHY: Centralizes build file location logic, checking multiple
|
|
53
|
+
possible locations to support different installation scenarios.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
Path to the MONITOR_BUILD file
|
|
57
|
+
"""
|
|
58
|
+
# Try project root first (development)
|
|
59
|
+
try:
|
|
60
|
+
from claude_mpm.config.paths import paths
|
|
61
|
+
|
|
62
|
+
build_file = paths.project_root / self.BUILD_FILE_NAME
|
|
63
|
+
if build_file.parent.exists():
|
|
64
|
+
return build_file
|
|
65
|
+
except ImportError:
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
# Fallback to package root
|
|
69
|
+
package_root = Path(__file__).parent.parent.parent
|
|
70
|
+
return package_root / self.BUILD_FILE_NAME
|
|
71
|
+
|
|
72
|
+
async def _initialize(self) -> None:
|
|
73
|
+
"""Initialize the service and ensure build file exists.
|
|
74
|
+
|
|
75
|
+
WHY: Ensures the build file exists with default values on first run,
|
|
76
|
+
preventing errors and providing a clean starting point.
|
|
77
|
+
"""
|
|
78
|
+
await self._ensure_build_file_exists()
|
|
79
|
+
await self._load_build_info()
|
|
80
|
+
|
|
81
|
+
async def _cleanup(self) -> None:
|
|
82
|
+
"""Cleanup service resources."""
|
|
83
|
+
self._cached_build_info = None
|
|
84
|
+
|
|
85
|
+
async def _ensure_build_file_exists(self) -> None:
|
|
86
|
+
"""Ensure the MONITOR_BUILD file exists with default values.
|
|
87
|
+
|
|
88
|
+
WHY: Atomic file creation prevents race conditions when multiple
|
|
89
|
+
processes might try to create the file simultaneously.
|
|
90
|
+
"""
|
|
91
|
+
if not self._build_file_path.exists():
|
|
92
|
+
default_info = {
|
|
93
|
+
"build_number": self.DEFAULT_BUILD_NUMBER,
|
|
94
|
+
"version": self.DEFAULT_VERSION,
|
|
95
|
+
"last_updated": None,
|
|
96
|
+
}
|
|
97
|
+
await self._write_build_info(default_info)
|
|
98
|
+
self.logger.info(f"Created MONITOR_BUILD file at {self._build_file_path}")
|
|
99
|
+
|
|
100
|
+
async def _load_build_info(self) -> Dict[str, Any]:
|
|
101
|
+
"""Load build information from file.
|
|
102
|
+
|
|
103
|
+
WHY: Centralizes file reading with error handling and caching
|
|
104
|
+
to improve performance and reliability.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Dictionary with build information
|
|
108
|
+
"""
|
|
109
|
+
async with self._cache_lock:
|
|
110
|
+
try:
|
|
111
|
+
if self._build_file_path.exists():
|
|
112
|
+
content = self._build_file_path.read_text().strip()
|
|
113
|
+
|
|
114
|
+
# Try to parse as JSON first
|
|
115
|
+
try:
|
|
116
|
+
self._cached_build_info = json.loads(content)
|
|
117
|
+
except json.JSONDecodeError:
|
|
118
|
+
# Fallback: treat as plain build number
|
|
119
|
+
try:
|
|
120
|
+
build_num = int(content)
|
|
121
|
+
self._cached_build_info = {
|
|
122
|
+
"build_number": build_num,
|
|
123
|
+
"version": self.DEFAULT_VERSION,
|
|
124
|
+
"last_updated": None,
|
|
125
|
+
}
|
|
126
|
+
except ValueError:
|
|
127
|
+
# Invalid content, use defaults
|
|
128
|
+
self._cached_build_info = {
|
|
129
|
+
"build_number": self.DEFAULT_BUILD_NUMBER,
|
|
130
|
+
"version": self.DEFAULT_VERSION,
|
|
131
|
+
"last_updated": None,
|
|
132
|
+
}
|
|
133
|
+
else:
|
|
134
|
+
self._cached_build_info = {
|
|
135
|
+
"build_number": self.DEFAULT_BUILD_NUMBER,
|
|
136
|
+
"version": self.DEFAULT_VERSION,
|
|
137
|
+
"last_updated": None,
|
|
138
|
+
}
|
|
139
|
+
except Exception as e:
|
|
140
|
+
self.logger.error(f"Error loading build info: {e}")
|
|
141
|
+
self._cached_build_info = {
|
|
142
|
+
"build_number": self.DEFAULT_BUILD_NUMBER,
|
|
143
|
+
"version": self.DEFAULT_VERSION,
|
|
144
|
+
"last_updated": None,
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return self._cached_build_info
|
|
148
|
+
|
|
149
|
+
async def _write_build_info(self, info: Dict[str, Any]) -> None:
|
|
150
|
+
"""Write build information to file atomically.
|
|
151
|
+
|
|
152
|
+
WHY: Atomic writes prevent file corruption if the process is
|
|
153
|
+
interrupted during the write operation.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
info: Build information dictionary
|
|
157
|
+
"""
|
|
158
|
+
# Add timestamp
|
|
159
|
+
from datetime import datetime, timezone
|
|
160
|
+
|
|
161
|
+
info["last_updated"] = datetime.now(timezone.utc).isoformat()
|
|
162
|
+
|
|
163
|
+
# Write atomically using temp file and rename
|
|
164
|
+
temp_fd, temp_path = tempfile.mkstemp(
|
|
165
|
+
dir=self._build_file_path.parent, prefix=".monitor_build_", suffix=".tmp"
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
# Write JSON content
|
|
170
|
+
with os.fdopen(temp_fd, "w") as f:
|
|
171
|
+
json.dump(info, f, indent=2)
|
|
172
|
+
|
|
173
|
+
# Atomic rename
|
|
174
|
+
Path(temp_path).replace(self._build_file_path)
|
|
175
|
+
|
|
176
|
+
# Update cache
|
|
177
|
+
async with self._cache_lock:
|
|
178
|
+
self._cached_build_info = info
|
|
179
|
+
|
|
180
|
+
except Exception as e:
|
|
181
|
+
# Clean up temp file on error
|
|
182
|
+
Path(temp_path).unlink(missing_ok=True)
|
|
183
|
+
raise e
|
|
184
|
+
|
|
185
|
+
async def get_build_number(self) -> int:
|
|
186
|
+
"""Get the current monitor build number.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
Current build number as integer
|
|
190
|
+
"""
|
|
191
|
+
info = await self._load_build_info()
|
|
192
|
+
return info.get("build_number", self.DEFAULT_BUILD_NUMBER)
|
|
193
|
+
|
|
194
|
+
async def get_formatted_build_number(self) -> str:
|
|
195
|
+
"""Get the current build number as a 4-digit string.
|
|
196
|
+
|
|
197
|
+
WHY: Consistent 4-digit formatting ensures proper sorting
|
|
198
|
+
and display alignment in the UI.
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
Build number as 4-digit zero-padded string
|
|
202
|
+
"""
|
|
203
|
+
build_num = await self.get_build_number()
|
|
204
|
+
return f"{build_num:04d}"
|
|
205
|
+
|
|
206
|
+
async def increment_build_number(self) -> int:
|
|
207
|
+
"""Increment and return the new build number.
|
|
208
|
+
|
|
209
|
+
WHY: Atomic increment operation ensures no build numbers are
|
|
210
|
+
skipped or duplicated even with concurrent access.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
New build number after incrementing
|
|
214
|
+
"""
|
|
215
|
+
info = await self._load_build_info()
|
|
216
|
+
new_build = info.get("build_number", self.DEFAULT_BUILD_NUMBER) + 1
|
|
217
|
+
info["build_number"] = new_build
|
|
218
|
+
await self._write_build_info(info)
|
|
219
|
+
|
|
220
|
+
self.logger.info(f"Monitor build number incremented to {new_build:04d}")
|
|
221
|
+
return new_build
|
|
222
|
+
|
|
223
|
+
async def get_monitor_version(self) -> str:
|
|
224
|
+
"""Get the monitor UI version.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
Monitor UI semantic version string
|
|
228
|
+
"""
|
|
229
|
+
info = await self._load_build_info()
|
|
230
|
+
return info.get("version", self.DEFAULT_VERSION)
|
|
231
|
+
|
|
232
|
+
async def set_monitor_version(self, version: str) -> None:
|
|
233
|
+
"""Set the monitor UI version.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
version: New semantic version string
|
|
237
|
+
"""
|
|
238
|
+
info = await self._load_build_info()
|
|
239
|
+
info["version"] = version
|
|
240
|
+
await self._write_build_info(info)
|
|
241
|
+
self.logger.info(f"Monitor version updated to {version}")
|
|
242
|
+
|
|
243
|
+
async def get_full_version_string(self) -> str:
|
|
244
|
+
"""Get the full version string for display.
|
|
245
|
+
|
|
246
|
+
WHY: Combines semantic version with build number for complete
|
|
247
|
+
version identification in the UI.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Full version string (e.g., "v1.0.0-0001")
|
|
251
|
+
"""
|
|
252
|
+
version = await self.get_monitor_version()
|
|
253
|
+
build = await self.get_formatted_build_number()
|
|
254
|
+
return f"v{version}-{build}"
|
|
255
|
+
|
|
256
|
+
async def get_build_info(self) -> Dict[str, Any]:
|
|
257
|
+
"""Get complete build information.
|
|
258
|
+
|
|
259
|
+
WHY: Provides all build metadata in a single call for
|
|
260
|
+
efficient transmission to the UI via SocketIO.
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
Dictionary with all build information
|
|
264
|
+
"""
|
|
265
|
+
info = await self._load_build_info()
|
|
266
|
+
|
|
267
|
+
# Get MPM version info
|
|
268
|
+
mpm_version = "unknown"
|
|
269
|
+
mpm_build = "unknown"
|
|
270
|
+
|
|
271
|
+
try:
|
|
272
|
+
from claude_mpm.services.version_service import VersionService
|
|
273
|
+
|
|
274
|
+
version_service = VersionService()
|
|
275
|
+
version_info = version_service.get_version_info()
|
|
276
|
+
mpm_version = version_info.get("base_version", "unknown")
|
|
277
|
+
mpm_build = version_info.get("build_number", "unknown")
|
|
278
|
+
except Exception as e:
|
|
279
|
+
self.logger.debug(f"Could not get MPM version info: {e}")
|
|
280
|
+
|
|
281
|
+
return {
|
|
282
|
+
"monitor": {
|
|
283
|
+
"version": info.get("version", self.DEFAULT_VERSION),
|
|
284
|
+
"build": info.get("build_number", self.DEFAULT_BUILD_NUMBER),
|
|
285
|
+
"formatted_build": f"{info.get('build_number', self.DEFAULT_BUILD_NUMBER):04d}",
|
|
286
|
+
"full_version": await self.get_full_version_string(),
|
|
287
|
+
"last_updated": info.get("last_updated"),
|
|
288
|
+
},
|
|
289
|
+
"mpm": {
|
|
290
|
+
"version": mpm_version,
|
|
291
|
+
"build": mpm_build,
|
|
292
|
+
"full_version": (
|
|
293
|
+
f"v{mpm_version}-build.{mpm_build}"
|
|
294
|
+
if mpm_build != "unknown"
|
|
295
|
+
else f"v{mpm_version}"
|
|
296
|
+
),
|
|
297
|
+
},
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
# Synchronous convenience methods for non-async contexts
|
|
301
|
+
|
|
302
|
+
def get_build_number_sync(self) -> int:
|
|
303
|
+
"""Synchronous version of get_build_number.
|
|
304
|
+
|
|
305
|
+
WHY: Some contexts (like SocketIO handlers) may not support
|
|
306
|
+
async operations directly.
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
Current build number as integer
|
|
310
|
+
"""
|
|
311
|
+
loop = asyncio.new_event_loop()
|
|
312
|
+
try:
|
|
313
|
+
return loop.run_until_complete(self.get_build_number())
|
|
314
|
+
finally:
|
|
315
|
+
loop.close()
|
|
316
|
+
|
|
317
|
+
def get_build_info_sync(self) -> Dict[str, Any]:
|
|
318
|
+
"""Synchronous version of get_build_info.
|
|
319
|
+
|
|
320
|
+
WHY: SocketIO connection handlers often need synchronous
|
|
321
|
+
access to build information.
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
Dictionary with all build information
|
|
325
|
+
"""
|
|
326
|
+
loop = asyncio.new_event_loop()
|
|
327
|
+
try:
|
|
328
|
+
return loop.run_until_complete(self.get_build_info())
|
|
329
|
+
finally:
|
|
330
|
+
loop.close()
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
# Global instance for singleton pattern
|
|
334
|
+
_monitor_build_service: Optional[MonitorBuildService] = None
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def get_monitor_build_service() -> MonitorBuildService:
|
|
338
|
+
"""Get or create the global monitor build service instance.
|
|
339
|
+
|
|
340
|
+
WHY: Singleton pattern ensures consistent build number management
|
|
341
|
+
across the application.
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
The global MonitorBuildService instance
|
|
345
|
+
"""
|
|
346
|
+
global _monitor_build_service
|
|
347
|
+
if _monitor_build_service is None:
|
|
348
|
+
_monitor_build_service = MonitorBuildService()
|
|
349
|
+
return _monitor_build_service
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"""Native Agent Converter Service
|
|
2
|
+
|
|
3
|
+
Converts MPM agent JSON definitions to Claude Code --agents flag format.
|
|
4
|
+
|
|
5
|
+
WHY: Claude Code 1.0.83+ supports native --agents flag for dynamic agent definition.
|
|
6
|
+
This allows agents to be passed directly via CLI instead of deployed to .claude/agents/.
|
|
7
|
+
|
|
8
|
+
DESIGN: Converts MPM agent schema → Claude native schema with field mappings:
|
|
9
|
+
- description → description (agent selection hint)
|
|
10
|
+
- system_instructions → prompt (agent behavior)
|
|
11
|
+
- allowed_tools → tools (tool limitations)
|
|
12
|
+
- model_tier → model (model selection)
|
|
13
|
+
|
|
14
|
+
USAGE:
|
|
15
|
+
converter = NativeAgentConverter()
|
|
16
|
+
agents_flag = converter.build_agents_flag(agent_configs)
|
|
17
|
+
# Returns: --agents '{"agent-name": {...}, ...}'
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any, Dict, List, Optional
|
|
23
|
+
|
|
24
|
+
from claude_mpm.core.logging_config import get_logger
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class NativeAgentConverter:
|
|
28
|
+
"""Converts MPM agent configurations to Claude Code --agents format."""
|
|
29
|
+
|
|
30
|
+
# Map MPM model tiers to Claude model names
|
|
31
|
+
MODEL_TIER_MAP = {
|
|
32
|
+
"opus": "opus",
|
|
33
|
+
"sonnet": "sonnet",
|
|
34
|
+
"haiku": "haiku",
|
|
35
|
+
"claude-3-opus": "opus",
|
|
36
|
+
"claude-3-sonnet": "sonnet",
|
|
37
|
+
"claude-3-haiku": "haiku",
|
|
38
|
+
"claude-3.5-sonnet": "sonnet",
|
|
39
|
+
"claude-4-sonnet": "sonnet",
|
|
40
|
+
"claude-4-opus": "opus",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Map MPM tool names to Claude tool names
|
|
44
|
+
TOOL_NAME_MAP = {
|
|
45
|
+
"Read": "Read",
|
|
46
|
+
"Write": "Write",
|
|
47
|
+
"Edit": "Edit",
|
|
48
|
+
"MultiEdit": "MultiEdit",
|
|
49
|
+
"Bash": "Bash",
|
|
50
|
+
"Grep": "Grep",
|
|
51
|
+
"Glob": "Glob",
|
|
52
|
+
"LS": "LS",
|
|
53
|
+
"WebSearch": "WebSearch",
|
|
54
|
+
"WebFetch": "WebFetch",
|
|
55
|
+
"TodoWrite": "TodoWrite",
|
|
56
|
+
"NotebookEdit": "NotebookEdit",
|
|
57
|
+
"BashOutput": "BashOutput",
|
|
58
|
+
"KillShell": "KillShell",
|
|
59
|
+
"AskUserQuestion": "AskUserQuestion",
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
def __init__(self):
|
|
63
|
+
"""Initialize the native agent converter."""
|
|
64
|
+
self.logger = get_logger(__name__)
|
|
65
|
+
|
|
66
|
+
def convert_mpm_agent_to_native(
|
|
67
|
+
self, agent_config: Dict[str, Any], agent_id: Optional[str] = None
|
|
68
|
+
) -> Dict[str, Any]:
|
|
69
|
+
"""Convert a single MPM agent config to Claude native format.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
agent_config: MPM agent JSON configuration
|
|
73
|
+
agent_id: Optional agent ID (falls back to agent_config['agent_id'])
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Dict with Claude native agent format:
|
|
77
|
+
{
|
|
78
|
+
"description": "...",
|
|
79
|
+
"prompt": "...",
|
|
80
|
+
"tools": [...],
|
|
81
|
+
"model": "sonnet"
|
|
82
|
+
}
|
|
83
|
+
"""
|
|
84
|
+
try:
|
|
85
|
+
# Extract agent ID
|
|
86
|
+
if not agent_id:
|
|
87
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
88
|
+
|
|
89
|
+
# Extract description (for agent selection)
|
|
90
|
+
description = agent_config.get("description", "")
|
|
91
|
+
if not description and "metadata" in agent_config:
|
|
92
|
+
description = agent_config["metadata"].get("description", "")
|
|
93
|
+
|
|
94
|
+
# Build prompt from instructions and BASE_*.md reference
|
|
95
|
+
prompt = self._build_agent_prompt(agent_config)
|
|
96
|
+
|
|
97
|
+
# Extract and map tools
|
|
98
|
+
tools = self._extract_and_map_tools(agent_config)
|
|
99
|
+
|
|
100
|
+
# Map model tier
|
|
101
|
+
model = self._map_model_tier(agent_config)
|
|
102
|
+
|
|
103
|
+
native_config = {
|
|
104
|
+
"description": description,
|
|
105
|
+
"prompt": prompt,
|
|
106
|
+
"tools": tools,
|
|
107
|
+
"model": model,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
self.logger.debug(f"Converted agent '{agent_id}' to native format")
|
|
111
|
+
return native_config
|
|
112
|
+
|
|
113
|
+
except Exception as e:
|
|
114
|
+
self.logger.error(f"Error converting agent {agent_id}: {e}")
|
|
115
|
+
# Return minimal valid config as fallback
|
|
116
|
+
return {
|
|
117
|
+
"description": f"Agent {agent_id}",
|
|
118
|
+
"prompt": agent_config.get("instructions", ""),
|
|
119
|
+
"tools": [],
|
|
120
|
+
"model": "sonnet",
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
def _build_agent_prompt(self, agent_config: Dict[str, Any]) -> str:
|
|
124
|
+
"""Build agent prompt from instructions and BASE_*.md reference.
|
|
125
|
+
|
|
126
|
+
OPTIMIZATION: Keep prompts concise for CLI argument length limits.
|
|
127
|
+
The BASE_*.md files contain full instructions, so we only need:
|
|
128
|
+
1. Reference to BASE file
|
|
129
|
+
2. Brief specialization note
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
agent_config: MPM agent configuration
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
Concise prompt string
|
|
136
|
+
"""
|
|
137
|
+
prompt_parts = []
|
|
138
|
+
|
|
139
|
+
# Add base instructions reference if available (most important)
|
|
140
|
+
if "knowledge" in agent_config:
|
|
141
|
+
base_file = agent_config["knowledge"].get("base_instructions_file")
|
|
142
|
+
if base_file:
|
|
143
|
+
prompt_parts.append(f"Follow {base_file} for all protocols.")
|
|
144
|
+
|
|
145
|
+
# Add main instructions (keep brief)
|
|
146
|
+
instructions = agent_config.get("instructions", "")
|
|
147
|
+
if instructions:
|
|
148
|
+
# Limit instruction length to avoid bloat
|
|
149
|
+
if len(instructions) > 300:
|
|
150
|
+
instructions = instructions[:300] + "..."
|
|
151
|
+
prompt_parts.append(instructions)
|
|
152
|
+
|
|
153
|
+
# Skip domain expertise and best practices for CLI mode
|
|
154
|
+
# These are already in BASE_*.md files referenced above
|
|
155
|
+
# Adding them here just bloats the JSON unnecessarily
|
|
156
|
+
|
|
157
|
+
return "\n".join(str(part) for part in prompt_parts if part)
|
|
158
|
+
|
|
159
|
+
def _extract_and_map_tools(self, agent_config: Dict[str, Any]) -> List[str]:
|
|
160
|
+
"""Extract and map tools from MPM config to Claude tool names.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
agent_config: MPM agent configuration
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
List of Claude tool names
|
|
167
|
+
"""
|
|
168
|
+
tools = []
|
|
169
|
+
|
|
170
|
+
# Check capabilities.tools
|
|
171
|
+
if "capabilities" in agent_config and "tools" in agent_config["capabilities"]:
|
|
172
|
+
mpm_tools = agent_config["capabilities"]["tools"]
|
|
173
|
+
for tool in mpm_tools:
|
|
174
|
+
mapped_tool = self.TOOL_NAME_MAP.get(tool, tool)
|
|
175
|
+
if mapped_tool not in tools:
|
|
176
|
+
tools.append(mapped_tool)
|
|
177
|
+
|
|
178
|
+
# If no tools specified, provide reasonable defaults
|
|
179
|
+
if not tools:
|
|
180
|
+
tools = ["Read", "Write", "Edit", "Bash", "Grep", "Glob"]
|
|
181
|
+
|
|
182
|
+
return tools
|
|
183
|
+
|
|
184
|
+
def _map_model_tier(self, agent_config: Dict[str, Any]) -> str:
|
|
185
|
+
"""Map MPM model tier to Claude model name.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
agent_config: MPM agent configuration
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Claude model name (opus, sonnet, haiku)
|
|
192
|
+
"""
|
|
193
|
+
# Check capabilities.model
|
|
194
|
+
if "capabilities" in agent_config and "model" in agent_config["capabilities"]:
|
|
195
|
+
model_tier = agent_config["capabilities"]["model"]
|
|
196
|
+
return self.MODEL_TIER_MAP.get(model_tier.lower(), "sonnet")
|
|
197
|
+
|
|
198
|
+
# Check metadata.model_preference
|
|
199
|
+
if (
|
|
200
|
+
"metadata" in agent_config
|
|
201
|
+
and "model_preference" in agent_config["metadata"]
|
|
202
|
+
):
|
|
203
|
+
model_tier = agent_config["metadata"]["model_preference"]
|
|
204
|
+
return self.MODEL_TIER_MAP.get(model_tier.lower(), "sonnet")
|
|
205
|
+
|
|
206
|
+
# Default to sonnet
|
|
207
|
+
return "sonnet"
|
|
208
|
+
|
|
209
|
+
def generate_agents_json(self, agents: List[Dict[str, Any]]) -> str:
|
|
210
|
+
"""Generate complete --agents JSON string from list of agent configs.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
agents: List of MPM agent configurations
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
JSON string for --agents flag
|
|
217
|
+
"""
|
|
218
|
+
native_agents = {}
|
|
219
|
+
|
|
220
|
+
for agent_config in agents:
|
|
221
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
222
|
+
if not agent_id:
|
|
223
|
+
self.logger.warning("Skipping agent without ID")
|
|
224
|
+
continue
|
|
225
|
+
|
|
226
|
+
# Skip PM agent (main Claude instance)
|
|
227
|
+
if agent_id.lower() in ["pm", "project_manager"]:
|
|
228
|
+
self.logger.debug(f"Skipping PM agent: {agent_id}")
|
|
229
|
+
continue
|
|
230
|
+
|
|
231
|
+
native_config = self.convert_mpm_agent_to_native(agent_config, agent_id)
|
|
232
|
+
native_agents[agent_id] = native_config
|
|
233
|
+
|
|
234
|
+
return json.dumps(native_agents, separators=(",", ":"))
|
|
235
|
+
|
|
236
|
+
def build_agents_flag(
|
|
237
|
+
self, agents: List[Dict[str, Any]], escape_for_shell: bool = True
|
|
238
|
+
) -> str:
|
|
239
|
+
"""Build complete --agents flag for CLI.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
agents: List of MPM agent configurations
|
|
243
|
+
escape_for_shell: Whether to escape JSON for shell
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Complete flag string: --agents '{"agent1": {...}, ...}'
|
|
247
|
+
"""
|
|
248
|
+
agents_json = self.generate_agents_json(agents)
|
|
249
|
+
|
|
250
|
+
# Check length (Claude CLI has argument length limits)
|
|
251
|
+
if len(agents_json) > 50000: # Conservative limit
|
|
252
|
+
self.logger.warning(
|
|
253
|
+
f"Agents JSON is very large ({len(agents_json)} chars). "
|
|
254
|
+
"Consider using file-based deployment."
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
if escape_for_shell:
|
|
258
|
+
# Escape for shell - wrap in single quotes
|
|
259
|
+
return f"--agents '{agents_json}'"
|
|
260
|
+
|
|
261
|
+
return f"--agents {agents_json}"
|
|
262
|
+
|
|
263
|
+
def load_agents_from_templates(
|
|
264
|
+
self, templates_dir: Optional[Path] = None
|
|
265
|
+
) -> List[Dict[str, Any]]:
|
|
266
|
+
"""Load all agent configs from templates directory.
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
templates_dir: Path to templates directory (defaults to MPM agents)
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
List of agent configurations
|
|
273
|
+
"""
|
|
274
|
+
if not templates_dir:
|
|
275
|
+
# Default to MPM agents directory
|
|
276
|
+
mpm_package_dir = Path(__file__).parent.parent / "agents" / "templates"
|
|
277
|
+
templates_dir = mpm_package_dir
|
|
278
|
+
|
|
279
|
+
if not templates_dir.exists():
|
|
280
|
+
self.logger.warning(f"Templates directory not found: {templates_dir}")
|
|
281
|
+
return []
|
|
282
|
+
|
|
283
|
+
agents = []
|
|
284
|
+
json_files = list(templates_dir.glob("*.json"))
|
|
285
|
+
|
|
286
|
+
self.logger.info(
|
|
287
|
+
f"Loading {len(json_files)} agent templates from {templates_dir}"
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
for json_file in json_files:
|
|
291
|
+
try:
|
|
292
|
+
# Skip base_agent.json
|
|
293
|
+
if json_file.stem == "base_agent":
|
|
294
|
+
continue
|
|
295
|
+
|
|
296
|
+
agent_config = json.loads(json_file.read_text())
|
|
297
|
+
agents.append(agent_config)
|
|
298
|
+
self.logger.debug(f"Loaded agent: {json_file.stem}")
|
|
299
|
+
|
|
300
|
+
except Exception as e:
|
|
301
|
+
self.logger.error(f"Error loading agent {json_file.name}: {e}")
|
|
302
|
+
continue
|
|
303
|
+
|
|
304
|
+
return agents
|
|
305
|
+
|
|
306
|
+
def estimate_json_size(self, agents: List[Dict[str, Any]]) -> int:
|
|
307
|
+
"""Estimate the size of --agents JSON output.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
agents: List of agent configurations
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
Estimated size in bytes
|
|
314
|
+
"""
|
|
315
|
+
agents_json = self.generate_agents_json(agents)
|
|
316
|
+
return len(agents_json.encode("utf-8"))
|
|
317
|
+
|
|
318
|
+
def get_conversion_summary(self, agents: List[Dict[str, Any]]) -> Dict[str, Any]:
|
|
319
|
+
"""Get summary of agent conversion for reporting.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
agents: List of agent configurations
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
Summary dict with counts and size info
|
|
326
|
+
"""
|
|
327
|
+
native_agents = {}
|
|
328
|
+
model_counts = {"opus": 0, "sonnet": 0, "haiku": 0}
|
|
329
|
+
tool_usage = {}
|
|
330
|
+
|
|
331
|
+
for agent_config in agents:
|
|
332
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
333
|
+
if not agent_id or agent_id.lower() in ["pm", "project_manager"]:
|
|
334
|
+
continue
|
|
335
|
+
|
|
336
|
+
native_config = self.convert_mpm_agent_to_native(agent_config, agent_id)
|
|
337
|
+
native_agents[agent_id] = native_config
|
|
338
|
+
|
|
339
|
+
# Count models
|
|
340
|
+
model = native_config.get("model", "sonnet")
|
|
341
|
+
model_counts[model] = model_counts.get(model, 0) + 1
|
|
342
|
+
|
|
343
|
+
# Count tools
|
|
344
|
+
for tool in native_config.get("tools", []):
|
|
345
|
+
tool_usage[tool] = tool_usage.get(tool, 0) + 1
|
|
346
|
+
|
|
347
|
+
json_size = len(json.dumps(native_agents, separators=(",", ":")))
|
|
348
|
+
|
|
349
|
+
return {
|
|
350
|
+
"total_agents": len(native_agents),
|
|
351
|
+
"json_size": json_size,
|
|
352
|
+
"json_size_kb": round(json_size / 1024, 2),
|
|
353
|
+
"model_distribution": model_counts,
|
|
354
|
+
"tool_usage": tool_usage,
|
|
355
|
+
"agents": list(native_agents.keys()),
|
|
356
|
+
}
|