claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__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_FOUNDERS_OUTPUT_STYLE.md +405 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -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 +94 -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 +2501 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_reconcile.py +197 -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 +3253 -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 +1398 -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 +298 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +31 -0
- claude_mpm/cli/interactive/agent_wizard.py +1927 -0
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -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 +649 -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 +1578 -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 +133 -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 +491 -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 +612 -0
- claude_mpm/core/unified_paths.py +958 -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/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/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 +1377 -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_reconciler.py +577 -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/startup_reconciliation.py +138 -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 +1205 -0
- claude_mpm/services/agents/startup_sync.py +262 -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 +711 -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 +1340 -0
- claude_mpm/services/skills/selective_skill_deployer.py +743 -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/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/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/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/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/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/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/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/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/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/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 +1189 -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 +844 -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.85.dist-info/METADATA +1023 -0
- claude_mpm-5.4.85.dist-info/RECORD +980 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.85.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.85.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,670 @@
|
|
|
1
|
+
"""Interactive session handler for Claude runner.
|
|
2
|
+
|
|
3
|
+
This module provides the InteractiveSession class that manages Claude's interactive mode
|
|
4
|
+
with proper separation of concerns and reduced complexity.
|
|
5
|
+
|
|
6
|
+
DEPENDENCY INJECTION:
|
|
7
|
+
This module uses protocol-based dependency injection to break circular imports.
|
|
8
|
+
Instead of importing ClaudeRunner directly, it uses ClaudeRunnerProtocol which
|
|
9
|
+
defines the interface it needs. This allows ClaudeRunner to create instances
|
|
10
|
+
of InteractiveSession without circular dependency issues.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import contextlib
|
|
14
|
+
import os
|
|
15
|
+
import subprocess # nosec B404
|
|
16
|
+
import uuid
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple
|
|
19
|
+
|
|
20
|
+
from claude_mpm.core.enums import ServiceState
|
|
21
|
+
from claude_mpm.core.logger import get_logger
|
|
22
|
+
|
|
23
|
+
# Protocol imports for type checking without circular dependencies
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from claude_mpm.core.protocols import ClaudeRunnerProtocol
|
|
26
|
+
else:
|
|
27
|
+
# At runtime, accept any object with matching interface
|
|
28
|
+
ClaudeRunnerProtocol = Any
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class InteractiveSession:
|
|
32
|
+
"""
|
|
33
|
+
Handles interactive Claude sessions with proper separation of concerns.
|
|
34
|
+
|
|
35
|
+
WHY: The original run_interactive() method had complexity of 39 and 262 lines.
|
|
36
|
+
This class breaks down that functionality into smaller, focused methods with
|
|
37
|
+
complexity <10 and lines <80 each, improving maintainability and testability.
|
|
38
|
+
|
|
39
|
+
DESIGN DECISION: Uses composition over inheritance - takes ClaudeRunner as
|
|
40
|
+
dependency rather than inheriting from it. This maintains loose coupling
|
|
41
|
+
and makes testing easier while preserving all original functionality.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, runner: "ClaudeRunnerProtocol"):
|
|
45
|
+
"""Initialize interactive session handler.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
runner: ClaudeRunner instance (or any object matching ClaudeRunnerProtocol)
|
|
49
|
+
with all necessary services
|
|
50
|
+
"""
|
|
51
|
+
self.runner: ClaudeRunnerProtocol = runner
|
|
52
|
+
self.logger = get_logger("interactive_session")
|
|
53
|
+
self.session_id = None
|
|
54
|
+
self.original_cwd = Path.cwd()
|
|
55
|
+
|
|
56
|
+
# Initialize response tracking for interactive sessions
|
|
57
|
+
# WHY: Interactive sessions need response logging just like oneshot sessions.
|
|
58
|
+
# The hook system captures events, but we need the ResponseTracker to be
|
|
59
|
+
# initialized to actually store them.
|
|
60
|
+
self.response_tracker = None
|
|
61
|
+
|
|
62
|
+
# Check if response logging is enabled in configuration
|
|
63
|
+
try:
|
|
64
|
+
response_config = self.runner.config.get("response_logging", {})
|
|
65
|
+
response_logging_enabled = response_config.get("enabled", False)
|
|
66
|
+
except (AttributeError, TypeError):
|
|
67
|
+
# Handle mock or missing config gracefully
|
|
68
|
+
response_logging_enabled = False
|
|
69
|
+
|
|
70
|
+
if response_logging_enabled:
|
|
71
|
+
try:
|
|
72
|
+
from claude_mpm.services.response_tracker import ResponseTracker
|
|
73
|
+
|
|
74
|
+
self.response_tracker = ResponseTracker(self.runner.config)
|
|
75
|
+
self.logger.info(
|
|
76
|
+
"Response tracking initialized for interactive session"
|
|
77
|
+
)
|
|
78
|
+
except Exception as e:
|
|
79
|
+
self.logger.warning(f"Failed to initialize response tracker: {e}")
|
|
80
|
+
# Continue without response tracking - not fatal
|
|
81
|
+
|
|
82
|
+
def initialize_interactive_session(self) -> Tuple[bool, Optional[str]]:
|
|
83
|
+
"""Initialize the interactive session environment.
|
|
84
|
+
|
|
85
|
+
Sets up WebSocket connections, generates session IDs, and prepares
|
|
86
|
+
the session for launch.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
Tuple of (success, error_message)
|
|
90
|
+
"""
|
|
91
|
+
try:
|
|
92
|
+
# Generate session ID
|
|
93
|
+
self.session_id = str(uuid.uuid4())
|
|
94
|
+
|
|
95
|
+
# Initialize WebSocket if enabled
|
|
96
|
+
if self.runner.enable_websocket:
|
|
97
|
+
success, error = self._initialize_websocket()
|
|
98
|
+
if not success:
|
|
99
|
+
self.logger.warning(f"WebSocket initialization failed: {error}")
|
|
100
|
+
# Continue without WebSocket - not a fatal error
|
|
101
|
+
|
|
102
|
+
# Banner now displayed in CLI startup - see startup_display.py
|
|
103
|
+
# Removed duplicate _display_welcome_message() to consolidate with main banner
|
|
104
|
+
|
|
105
|
+
# Log session start
|
|
106
|
+
if self.runner.project_logger:
|
|
107
|
+
self.runner.project_logger.log_system(
|
|
108
|
+
"Starting interactive session", level="INFO", component="session"
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
if self.response_tracker and self.response_tracker.enabled:
|
|
112
|
+
try:
|
|
113
|
+
# Set the session ID in the tracker for correlation
|
|
114
|
+
if (
|
|
115
|
+
hasattr(self.response_tracker, "session_logger")
|
|
116
|
+
and self.response_tracker.session_logger
|
|
117
|
+
):
|
|
118
|
+
self.response_tracker.session_logger.set_session_id(
|
|
119
|
+
self.session_id
|
|
120
|
+
)
|
|
121
|
+
self.logger.debug(
|
|
122
|
+
f"Response tracker session ID set to: {self.session_id}"
|
|
123
|
+
)
|
|
124
|
+
except Exception as e:
|
|
125
|
+
self.logger.debug(
|
|
126
|
+
f"Could not set session ID in response tracker: {e}"
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
return True, None
|
|
130
|
+
|
|
131
|
+
except Exception as e:
|
|
132
|
+
error_msg = f"Failed to initialize session: {e}"
|
|
133
|
+
self.logger.error(error_msg)
|
|
134
|
+
return False, error_msg
|
|
135
|
+
|
|
136
|
+
def setup_interactive_environment(self) -> Tuple[bool, Dict[str, Any]]:
|
|
137
|
+
"""Set up the interactive environment including agents and commands.
|
|
138
|
+
|
|
139
|
+
Deploys system and project agents, prepares the command line,
|
|
140
|
+
and sets up the execution environment.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
Tuple of (success, environment_dict)
|
|
144
|
+
"""
|
|
145
|
+
try:
|
|
146
|
+
# Deploy system agents
|
|
147
|
+
if not self.runner.setup_agents():
|
|
148
|
+
print("Continuing without native agents...")
|
|
149
|
+
|
|
150
|
+
# Deploy project-specific agents
|
|
151
|
+
self.runner.deploy_project_agents_to_claude()
|
|
152
|
+
|
|
153
|
+
# Build command
|
|
154
|
+
cmd = self._build_claude_command()
|
|
155
|
+
|
|
156
|
+
# Prepare environment
|
|
157
|
+
env = self._prepare_environment()
|
|
158
|
+
|
|
159
|
+
# Change to user directory if needed
|
|
160
|
+
self._change_to_user_directory(env)
|
|
161
|
+
|
|
162
|
+
return True, {
|
|
163
|
+
"command": cmd,
|
|
164
|
+
"environment": env,
|
|
165
|
+
"session_id": self.session_id,
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
except Exception as e:
|
|
169
|
+
error_msg = f"Failed to setup environment: {e}"
|
|
170
|
+
self.logger.error(error_msg)
|
|
171
|
+
return False, {}
|
|
172
|
+
|
|
173
|
+
def handle_interactive_input(self, environment: Dict[str, Any]) -> bool:
|
|
174
|
+
"""Handle the interactive input/output loop.
|
|
175
|
+
|
|
176
|
+
Launches Claude and manages the interactive session using either
|
|
177
|
+
exec or subprocess method based on configuration.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
environment: Dictionary with command, env vars, and session info
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
bool: True if successful, False otherwise
|
|
184
|
+
"""
|
|
185
|
+
try:
|
|
186
|
+
cmd = environment["command"]
|
|
187
|
+
env = environment["environment"]
|
|
188
|
+
|
|
189
|
+
print("Launching Claude...")
|
|
190
|
+
|
|
191
|
+
# Log launch attempt
|
|
192
|
+
self._log_launch_attempt(cmd)
|
|
193
|
+
|
|
194
|
+
# Notify WebSocket if connected
|
|
195
|
+
if self.runner.websocket_server:
|
|
196
|
+
self.runner.websocket_server.claude_status_changed(
|
|
197
|
+
status=ServiceState.STARTING,
|
|
198
|
+
message="Launching Claude interactive session",
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
# Launch using selected method
|
|
202
|
+
if self.runner.launch_method == "subprocess":
|
|
203
|
+
return self._launch_subprocess_mode(cmd, env)
|
|
204
|
+
return self._launch_exec_mode(cmd, env)
|
|
205
|
+
|
|
206
|
+
except FileNotFoundError as e:
|
|
207
|
+
self._handle_launch_error("FileNotFoundError", e)
|
|
208
|
+
return False
|
|
209
|
+
except PermissionError as e:
|
|
210
|
+
self._handle_launch_error("PermissionError", e)
|
|
211
|
+
return False
|
|
212
|
+
except OSError as e:
|
|
213
|
+
self._handle_launch_error("OSError", e)
|
|
214
|
+
return self._attempt_fallback_launch(environment)
|
|
215
|
+
except KeyboardInterrupt:
|
|
216
|
+
self._handle_keyboard_interrupt()
|
|
217
|
+
return True # Clean exit
|
|
218
|
+
except Exception as e:
|
|
219
|
+
self._handle_launch_error("Exception", e)
|
|
220
|
+
return self._attempt_fallback_launch(environment)
|
|
221
|
+
|
|
222
|
+
def process_interactive_command(self, prompt: str) -> Optional[bool]:
|
|
223
|
+
"""Process special interactive commands.
|
|
224
|
+
|
|
225
|
+
NOTE: As of v4.1.2, MPM slash commands are deployed as markdown files
|
|
226
|
+
to ~/.claude/commands and handled directly by Claude Code.
|
|
227
|
+
This method is kept for potential future use with non-Claude commands.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
prompt: User input command
|
|
231
|
+
|
|
232
|
+
Returns:
|
|
233
|
+
Optional[bool]: True if handled, False if error, None if not a special command
|
|
234
|
+
"""
|
|
235
|
+
# Currently no commands are intercepted - all MPM commands are handled by Claude Code
|
|
236
|
+
return None
|
|
237
|
+
|
|
238
|
+
def cleanup_interactive_session(self) -> None:
|
|
239
|
+
"""Clean up resources after interactive session ends.
|
|
240
|
+
|
|
241
|
+
Restores original directory, closes connections, and logs session end.
|
|
242
|
+
"""
|
|
243
|
+
try:
|
|
244
|
+
# Restore original directory
|
|
245
|
+
if self.original_cwd and Path(self.original_cwd).exists():
|
|
246
|
+
with contextlib.suppress(OSError):
|
|
247
|
+
os.chdir(self.original_cwd)
|
|
248
|
+
|
|
249
|
+
# Close WebSocket if connected
|
|
250
|
+
if self.runner.websocket_server:
|
|
251
|
+
self.runner.websocket_server.session_ended()
|
|
252
|
+
self.runner.websocket_server = None
|
|
253
|
+
|
|
254
|
+
# Log session end
|
|
255
|
+
if self.runner.project_logger:
|
|
256
|
+
self.runner.project_logger.log_system(
|
|
257
|
+
"Interactive session ended", level="INFO", component="session"
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
# Log session event
|
|
261
|
+
if self.runner.session_log_file:
|
|
262
|
+
self.runner._log_session_event(
|
|
263
|
+
{"event": "session_end", "session_id": self.session_id}
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
if self.response_tracker:
|
|
267
|
+
try:
|
|
268
|
+
# Clear the session ID to stop tracking this session
|
|
269
|
+
if (
|
|
270
|
+
hasattr(self.response_tracker, "session_logger")
|
|
271
|
+
and self.response_tracker.session_logger
|
|
272
|
+
):
|
|
273
|
+
self.response_tracker.session_logger.set_session_id(None)
|
|
274
|
+
self.logger.debug("Response tracker session cleared")
|
|
275
|
+
except Exception as e:
|
|
276
|
+
self.logger.debug(f"Error clearing response tracker session: {e}")
|
|
277
|
+
|
|
278
|
+
except Exception as e:
|
|
279
|
+
self.logger.debug(f"Error during cleanup: {e}")
|
|
280
|
+
|
|
281
|
+
# Private helper methods (each <80 lines, complexity <10)
|
|
282
|
+
|
|
283
|
+
def _initialize_websocket(self) -> Tuple[bool, Optional[str]]:
|
|
284
|
+
"""Initialize WebSocket connection for monitoring."""
|
|
285
|
+
try:
|
|
286
|
+
from claude_mpm.services.socketio_server import SocketIOClientProxy
|
|
287
|
+
|
|
288
|
+
self.runner.websocket_server = SocketIOClientProxy(
|
|
289
|
+
port=self.runner.websocket_port
|
|
290
|
+
)
|
|
291
|
+
self.runner.websocket_server.start()
|
|
292
|
+
self.logger.info("Connected to Socket.IO monitoring server")
|
|
293
|
+
|
|
294
|
+
# Notify session start
|
|
295
|
+
self.runner.websocket_server.session_started(
|
|
296
|
+
session_id=self.session_id,
|
|
297
|
+
launch_method=self.runner.launch_method,
|
|
298
|
+
working_dir=Path.cwd(),
|
|
299
|
+
)
|
|
300
|
+
return True, None
|
|
301
|
+
|
|
302
|
+
except ImportError as e:
|
|
303
|
+
return False, f"Socket.IO module not available: {e}"
|
|
304
|
+
except ConnectionError as e:
|
|
305
|
+
return False, f"Cannot connect to Socket.IO server: {e}"
|
|
306
|
+
except Exception as e:
|
|
307
|
+
return False, f"Unexpected error with Socket.IO: {e}"
|
|
308
|
+
|
|
309
|
+
def _display_welcome_message(self) -> None:
|
|
310
|
+
"""Display the interactive session welcome message.
|
|
311
|
+
|
|
312
|
+
DEPRECATED: This method is kept for backward compatibility with tests.
|
|
313
|
+
The main banner is now displayed in startup_display.py during CLI startup.
|
|
314
|
+
This consolidated approach prevents duplicate banners.
|
|
315
|
+
"""
|
|
316
|
+
version_str = self.runner._get_version()
|
|
317
|
+
|
|
318
|
+
# Get output style status
|
|
319
|
+
output_style_info = self._get_output_style_info()
|
|
320
|
+
|
|
321
|
+
print("\033[32m╭───────────────────────────────────────────────────╮\033[0m")
|
|
322
|
+
print(
|
|
323
|
+
"\033[32m│\033[0m ✻ Claude MPM - Interactive Session \033[32m│\033[0m"
|
|
324
|
+
)
|
|
325
|
+
print(f"\033[32m│\033[0m Version {version_str:<40}\033[32m│\033[0m")
|
|
326
|
+
if output_style_info:
|
|
327
|
+
print(f"\033[32m│\033[0m {output_style_info:<49}\033[32m│\033[0m")
|
|
328
|
+
print("\033[32m│ │\033[0m")
|
|
329
|
+
print(
|
|
330
|
+
"\033[32m│\033[0m MPM Commands (via Claude Code): \033[32m│\033[0m"
|
|
331
|
+
)
|
|
332
|
+
print(
|
|
333
|
+
"\033[32m│\033[0m /mpm - MPM overview and help \033[32m│\033[0m"
|
|
334
|
+
)
|
|
335
|
+
print(
|
|
336
|
+
"\033[32m│\033[0m /mpm-init - Initialize or update project \033[32m│\033[0m"
|
|
337
|
+
)
|
|
338
|
+
print(
|
|
339
|
+
"\033[32m│\033[0m /mpm-agents - Show available agents \033[32m│\033[0m"
|
|
340
|
+
)
|
|
341
|
+
print(
|
|
342
|
+
"\033[32m│\033[0m /mpm-doctor - Run diagnostic checks \033[32m│\033[0m"
|
|
343
|
+
)
|
|
344
|
+
print(
|
|
345
|
+
"\033[32m│\033[0m Type / for autocomplete in Claude Code \033[32m│\033[0m"
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
print("\033[32m╰───────────────────────────────────────────────────╯\033[0m")
|
|
349
|
+
print("") # Add blank line after box
|
|
350
|
+
|
|
351
|
+
def _get_output_style_info(self) -> Optional[str]:
|
|
352
|
+
"""Get output style status for display."""
|
|
353
|
+
try:
|
|
354
|
+
# Check if output style manager is available through framework loader
|
|
355
|
+
if (
|
|
356
|
+
hasattr(self.runner, "framework_loader")
|
|
357
|
+
and self.runner.framework_loader
|
|
358
|
+
) and hasattr(self.runner.framework_loader, "output_style_manager"):
|
|
359
|
+
osm = self.runner.framework_loader.output_style_manager
|
|
360
|
+
if osm:
|
|
361
|
+
if osm.claude_version and osm.supports_output_styles():
|
|
362
|
+
# Check if Claude MPM style is active
|
|
363
|
+
settings_file = osm.settings_file
|
|
364
|
+
if settings_file.exists():
|
|
365
|
+
import json
|
|
366
|
+
|
|
367
|
+
settings = json.loads(settings_file.read_text())
|
|
368
|
+
active_style = settings.get("activeOutputStyle")
|
|
369
|
+
if active_style in ("Claude MPM", "Claude MPM Teacher"):
|
|
370
|
+
return f"Output Style: {active_style} ✅"
|
|
371
|
+
return f"Output Style: {active_style or 'none'}"
|
|
372
|
+
return "Output Style: Available"
|
|
373
|
+
return "Output Style: Injected (legacy)"
|
|
374
|
+
except Exception: # nosec B110
|
|
375
|
+
pass
|
|
376
|
+
return None
|
|
377
|
+
|
|
378
|
+
def _build_claude_command(self) -> list:
|
|
379
|
+
"""Build the Claude command with all necessary arguments."""
|
|
380
|
+
# Check if --resume flag is present
|
|
381
|
+
has_resume = self.runner.claude_args and "--resume" in self.runner.claude_args
|
|
382
|
+
|
|
383
|
+
if has_resume:
|
|
384
|
+
# When resuming, use minimal command to avoid interfering with conversation selection
|
|
385
|
+
self.logger.info(
|
|
386
|
+
"🔄 Resume mode detected - using minimal Claude command to preserve conversation selection"
|
|
387
|
+
)
|
|
388
|
+
cmd = ["claude"]
|
|
389
|
+
|
|
390
|
+
# Add only the claude_args (which includes --resume)
|
|
391
|
+
if self.runner.claude_args:
|
|
392
|
+
cmd.extend(self.runner.claude_args)
|
|
393
|
+
self.logger.info(f"Resume command: {cmd}")
|
|
394
|
+
|
|
395
|
+
return cmd
|
|
396
|
+
# Normal mode - full command with all claude-mpm enhancements
|
|
397
|
+
cmd = ["claude", "--dangerously-skip-permissions"]
|
|
398
|
+
|
|
399
|
+
# Add custom arguments
|
|
400
|
+
if self.runner.claude_args:
|
|
401
|
+
# Enhanced debug logging for --resume flag verification
|
|
402
|
+
self.logger.debug(f"Raw claude_args received: {self.runner.claude_args}")
|
|
403
|
+
cmd.extend(self.runner.claude_args)
|
|
404
|
+
|
|
405
|
+
# Add --agents flag if native agents mode is enabled
|
|
406
|
+
if getattr(self.runner, "use_native_agents", False):
|
|
407
|
+
agents_flag = self._build_agents_flag()
|
|
408
|
+
if agents_flag:
|
|
409
|
+
# Add --agents JSON directly (already properly formatted)
|
|
410
|
+
cmd.extend(agents_flag)
|
|
411
|
+
self.logger.info("✓ Native agents mode: Using --agents CLI flag")
|
|
412
|
+
|
|
413
|
+
# Add system instructions with file-based caching
|
|
414
|
+
from claude_mpm.core.system_context import create_simple_context
|
|
415
|
+
from claude_mpm.services.instructions.instruction_cache_service import (
|
|
416
|
+
InstructionCacheService,
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
system_prompt = self.runner._create_system_prompt()
|
|
420
|
+
if system_prompt and system_prompt != create_simple_context():
|
|
421
|
+
# Try to use cached instruction file for better performance
|
|
422
|
+
try:
|
|
423
|
+
# Initialize cache service with project root
|
|
424
|
+
if "CLAUDE_MPM_USER_PWD" in os.environ:
|
|
425
|
+
project_root = Path(os.environ["CLAUDE_MPM_USER_PWD"])
|
|
426
|
+
else:
|
|
427
|
+
project_root = Path.cwd()
|
|
428
|
+
|
|
429
|
+
# Instruction Caching (1M-446)
|
|
430
|
+
# Cache assembled instructions to file to avoid ARG_MAX limits on Linux/Windows.
|
|
431
|
+
# - Linux: 128 KB limit, instructions are ~152 KB (exceeds by 19.1%)
|
|
432
|
+
# - Windows: 32 KB limit (exceeds by 476%)
|
|
433
|
+
# Cache updates only when content hash changes (hash-based invalidation).
|
|
434
|
+
# Fallback to inline instruction if cache fails (graceful degradation).
|
|
435
|
+
cache_service = InstructionCacheService(project_root=project_root)
|
|
436
|
+
|
|
437
|
+
# Update cache with assembled instruction content
|
|
438
|
+
cache_result = cache_service.update_cache(
|
|
439
|
+
instruction_content=system_prompt
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
# Use cache file if available
|
|
443
|
+
if (
|
|
444
|
+
cache_result.get("updated")
|
|
445
|
+
or cache_service.get_cache_path().exists()
|
|
446
|
+
):
|
|
447
|
+
cache_file = cache_service.get_cache_path()
|
|
448
|
+
|
|
449
|
+
# Log cache operation
|
|
450
|
+
if cache_result.get("updated"):
|
|
451
|
+
self.logger.info(
|
|
452
|
+
f"Instruction cache updated: {cache_result.get('reason', 'unknown')}"
|
|
453
|
+
)
|
|
454
|
+
self.logger.debug(
|
|
455
|
+
f"Cache hash: {cache_result.get('content_hash', 'N/A')[:8]}..."
|
|
456
|
+
)
|
|
457
|
+
self.logger.debug(
|
|
458
|
+
f"Cache size: {cache_result.get('content_size_kb', 'N/A')} KB"
|
|
459
|
+
)
|
|
460
|
+
else:
|
|
461
|
+
self.logger.debug(
|
|
462
|
+
f"Using cached instructions: {cache_result.get('reason', 'unknown')}"
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
# Use file-based loading for better performance
|
|
466
|
+
cmd.extend(["--system-prompt-file", str(cache_file)])
|
|
467
|
+
self.logger.info(
|
|
468
|
+
f"✓ Using file-based instruction loading: {cache_file}"
|
|
469
|
+
)
|
|
470
|
+
else:
|
|
471
|
+
# Fallback to inline if cache file doesn't exist
|
|
472
|
+
self.logger.warning(
|
|
473
|
+
"Cache file not available, falling back to inline instruction"
|
|
474
|
+
)
|
|
475
|
+
cmd.extend(["--append-system-prompt", system_prompt])
|
|
476
|
+
|
|
477
|
+
except Exception as e:
|
|
478
|
+
# Graceful fallback - cache failures don't break deployment
|
|
479
|
+
self.logger.warning(f"Failed to cache instructions, using inline: {e}")
|
|
480
|
+
cmd.extend(["--append-system-prompt", system_prompt])
|
|
481
|
+
|
|
482
|
+
# Final command verification
|
|
483
|
+
# self.logger.info(f"Final Claude command built: {' '.join(cmd)}")
|
|
484
|
+
|
|
485
|
+
# Explicit --resume flag verification
|
|
486
|
+
if "--resume" in cmd:
|
|
487
|
+
self.logger.info("✅ VERIFIED: --resume flag IS included in final command")
|
|
488
|
+
self.logger.debug(f"--resume position in command: {cmd.index('--resume')}")
|
|
489
|
+
else:
|
|
490
|
+
self.logger.debug("[INFO]️ --resume flag NOT included in final command")
|
|
491
|
+
|
|
492
|
+
return cmd
|
|
493
|
+
|
|
494
|
+
def _build_agents_flag(self) -> Optional[list]:
|
|
495
|
+
"""Build --agents flag with all MPM agents.
|
|
496
|
+
|
|
497
|
+
Returns:
|
|
498
|
+
List with ["--agents", "<json>"] or None if conversion fails
|
|
499
|
+
"""
|
|
500
|
+
try:
|
|
501
|
+
from claude_mpm.services.native_agent_converter import NativeAgentConverter
|
|
502
|
+
|
|
503
|
+
converter = NativeAgentConverter()
|
|
504
|
+
agents = converter.load_agents_from_templates()
|
|
505
|
+
|
|
506
|
+
if not agents:
|
|
507
|
+
self.logger.warning("No agents loaded for native mode")
|
|
508
|
+
return None
|
|
509
|
+
|
|
510
|
+
# Generate JSON for --agents flag
|
|
511
|
+
agents_json = converter.generate_agents_json(agents)
|
|
512
|
+
summary = converter.get_conversion_summary(agents)
|
|
513
|
+
|
|
514
|
+
self.logger.info(
|
|
515
|
+
f"Native agents: {summary['total_agents']} agents, "
|
|
516
|
+
f"{summary['json_size_kb']} KB JSON"
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
# Return as list: ["--agents", "<json>"]
|
|
520
|
+
return ["--agents", agents_json]
|
|
521
|
+
|
|
522
|
+
except Exception as e:
|
|
523
|
+
self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
|
|
524
|
+
return None
|
|
525
|
+
|
|
526
|
+
def _prepare_environment(self) -> dict:
|
|
527
|
+
"""Prepare clean environment variables for Claude."""
|
|
528
|
+
clean_env = os.environ.copy()
|
|
529
|
+
|
|
530
|
+
# Remove Claude-specific variables that might interfere
|
|
531
|
+
claude_vars_to_remove = [
|
|
532
|
+
"CLAUDE_CODE_ENTRYPOINT",
|
|
533
|
+
"CLAUDECODE",
|
|
534
|
+
"CLAUDE_CONFIG_DIR",
|
|
535
|
+
"CLAUDE_MAX_PARALLEL_SUBAGENTS",
|
|
536
|
+
"CLAUDE_TIMEOUT",
|
|
537
|
+
]
|
|
538
|
+
for var in claude_vars_to_remove:
|
|
539
|
+
clean_env.pop(var, None)
|
|
540
|
+
|
|
541
|
+
# Disable telemetry for Claude Code
|
|
542
|
+
# This ensures Claude Code doesn't send telemetry data during runtime
|
|
543
|
+
clean_env["DISABLE_TELEMETRY"] = "1"
|
|
544
|
+
|
|
545
|
+
return clean_env
|
|
546
|
+
|
|
547
|
+
def _change_to_user_directory(self, env: dict) -> None:
|
|
548
|
+
"""Change to user's working directory if specified."""
|
|
549
|
+
if "CLAUDE_MPM_USER_PWD" in env:
|
|
550
|
+
user_pwd = env["CLAUDE_MPM_USER_PWD"]
|
|
551
|
+
env["CLAUDE_WORKSPACE"] = user_pwd
|
|
552
|
+
|
|
553
|
+
try:
|
|
554
|
+
os.chdir(user_pwd)
|
|
555
|
+
self.logger.info(f"Changed working directory to: {user_pwd}")
|
|
556
|
+
except (PermissionError, FileNotFoundError, OSError) as e:
|
|
557
|
+
self.logger.warning(f"Could not change to directory {user_pwd}: {e}")
|
|
558
|
+
|
|
559
|
+
def _log_launch_attempt(self, cmd: list) -> None:
|
|
560
|
+
"""Log the Claude launch attempt."""
|
|
561
|
+
if self.runner.project_logger:
|
|
562
|
+
self.runner.project_logger.log_system(
|
|
563
|
+
f"Launching Claude interactive mode with {self.runner.launch_method}",
|
|
564
|
+
level="INFO",
|
|
565
|
+
component="session",
|
|
566
|
+
)
|
|
567
|
+
self.runner._log_session_event(
|
|
568
|
+
{
|
|
569
|
+
"event": "launching_claude_interactive",
|
|
570
|
+
"command": " ".join(cmd),
|
|
571
|
+
"method": self.runner.launch_method,
|
|
572
|
+
}
|
|
573
|
+
)
|
|
574
|
+
|
|
575
|
+
def _launch_exec_mode(self, cmd: list, env: dict) -> bool:
|
|
576
|
+
"""Launch Claude using exec mode (replaces current process)."""
|
|
577
|
+
# Notify WebSocket before exec
|
|
578
|
+
if self.runner.websocket_server:
|
|
579
|
+
self.runner.websocket_server.claude_status_changed(
|
|
580
|
+
status=ServiceState.RUNNING,
|
|
581
|
+
message="Claude process started (exec mode)",
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
# This will not return if successful
|
|
585
|
+
os.execvpe(cmd[0], cmd, env) # nosec B606
|
|
586
|
+
return False # Only reached on failure
|
|
587
|
+
|
|
588
|
+
def _launch_subprocess_mode(self, cmd: list, env: dict) -> bool:
|
|
589
|
+
"""Launch Claude as subprocess with PTY."""
|
|
590
|
+
# Delegate to runner's existing method
|
|
591
|
+
self.runner._launch_subprocess_interactive(cmd, env)
|
|
592
|
+
return True
|
|
593
|
+
|
|
594
|
+
def _handle_launch_error(self, error_type: str, error: Exception) -> None:
|
|
595
|
+
"""Handle errors during Claude launch."""
|
|
596
|
+
error_messages = {
|
|
597
|
+
"FileNotFoundError": "Claude CLI not found. Please ensure 'claude' is installed and in your PATH",
|
|
598
|
+
"PermissionError": "Permission denied executing Claude CLI",
|
|
599
|
+
"OSError": "OS error launching Claude",
|
|
600
|
+
"Exception": "Unexpected error launching Claude",
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
error_msg = f"{error_messages.get(error_type, 'Error')}: {error}"
|
|
604
|
+
print(f"❌ {error_msg}")
|
|
605
|
+
|
|
606
|
+
if self.runner.project_logger:
|
|
607
|
+
self.runner.project_logger.log_system(
|
|
608
|
+
error_msg, level="ERROR", component="session"
|
|
609
|
+
)
|
|
610
|
+
self.runner._log_session_event(
|
|
611
|
+
{
|
|
612
|
+
"event": "interactive_launch_failed",
|
|
613
|
+
"error": str(error),
|
|
614
|
+
"exception_type": error_type,
|
|
615
|
+
}
|
|
616
|
+
)
|
|
617
|
+
|
|
618
|
+
# Notify WebSocket of error
|
|
619
|
+
if self.runner.websocket_server:
|
|
620
|
+
self.runner.websocket_server.claude_status_changed(
|
|
621
|
+
status=ServiceState.ERROR, message=f"Failed to launch Claude: {error}"
|
|
622
|
+
)
|
|
623
|
+
|
|
624
|
+
def _handle_keyboard_interrupt(self) -> None:
|
|
625
|
+
"""Handle keyboard interrupt during session."""
|
|
626
|
+
print("\n⚠️ Session interrupted by user")
|
|
627
|
+
|
|
628
|
+
if self.runner.project_logger:
|
|
629
|
+
self.runner.project_logger.log_system(
|
|
630
|
+
"Session interrupted by user", level="INFO", component="session"
|
|
631
|
+
)
|
|
632
|
+
self.runner._log_session_event(
|
|
633
|
+
{"event": "session_interrupted", "reason": "user_interrupt"}
|
|
634
|
+
)
|
|
635
|
+
|
|
636
|
+
def _attempt_fallback_launch(self, environment: Dict[str, Any]) -> bool:
|
|
637
|
+
"""Attempt fallback launch using subprocess."""
|
|
638
|
+
print("\n🔄 Attempting fallback launch method...")
|
|
639
|
+
|
|
640
|
+
try:
|
|
641
|
+
cmd = environment["command"]
|
|
642
|
+
env = environment["environment"]
|
|
643
|
+
|
|
644
|
+
result = subprocess.run( # nosec B603
|
|
645
|
+
cmd, stdin=None, stdout=None, stderr=None, env=env, check=False
|
|
646
|
+
)
|
|
647
|
+
|
|
648
|
+
if result.returncode == 0:
|
|
649
|
+
if self.runner.project_logger:
|
|
650
|
+
self.runner.project_logger.log_system(
|
|
651
|
+
"Interactive session completed (subprocess fallback)",
|
|
652
|
+
level="INFO",
|
|
653
|
+
component="session",
|
|
654
|
+
)
|
|
655
|
+
return True
|
|
656
|
+
print(f"⚠️ Claude exited with code {result.returncode}")
|
|
657
|
+
return False
|
|
658
|
+
|
|
659
|
+
except FileNotFoundError:
|
|
660
|
+
print("❌ Fallback failed: Claude CLI not found in PATH")
|
|
661
|
+
print("\n💡 To fix this issue:")
|
|
662
|
+
print(" 1. Install Claude CLI: npm install -g @anthropic-ai/claude-ai")
|
|
663
|
+
print(" 2. Or specify the full path to the claude binary")
|
|
664
|
+
return False
|
|
665
|
+
except KeyboardInterrupt:
|
|
666
|
+
print("\n⚠️ Fallback interrupted by user")
|
|
667
|
+
return True
|
|
668
|
+
except Exception as e:
|
|
669
|
+
print(f"❌ Fallback failed with unexpected error: {e}")
|
|
670
|
+
return False
|