claude-mpm 3.4.10__py3-none-any.whl → 5.4.55__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/BUILD_NUMBER +1 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +290 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1402 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +90 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2503 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +2654 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1246 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +297 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1947 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +644 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1743 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +132 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +278 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +483 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +570 -0
- claude_mpm/core/unified_paths.py +941 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +201 -107
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1369 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1202 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +707 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1324 -0
- claude_mpm/services/skills/selective_skill_deployer.py +744 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1090 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +823 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.55.dist-info/METADATA +999 -0
- claude_mpm-5.4.55.dist-info/RECORD +868 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.55.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.55.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/top_level.txt +0 -0
|
@@ -13,16 +13,25 @@ agent outputs because:
|
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
import re
|
|
16
|
-
from
|
|
17
|
-
from
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
from typing import Dict, List
|
|
18
|
+
|
|
18
19
|
from claude_mpm.core.config import Config
|
|
19
|
-
from claude_mpm.core.
|
|
20
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
21
|
+
from claude_mpm.core.shared.config_loader import ConfigLoader
|
|
22
|
+
from claude_mpm.hooks.base_hook import (
|
|
23
|
+
HookContext,
|
|
24
|
+
HookResult,
|
|
25
|
+
PostDelegationHook,
|
|
26
|
+
PreDelegationHook,
|
|
27
|
+
)
|
|
20
28
|
|
|
21
29
|
logger = get_logger(__name__)
|
|
22
30
|
|
|
23
31
|
# Try to import memory manager with fallback handling
|
|
24
32
|
try:
|
|
25
|
-
from claude_mpm.services.
|
|
33
|
+
from claude_mpm.services.agents.memory import AgentMemoryManager
|
|
34
|
+
|
|
26
35
|
MEMORY_MANAGER_AVAILABLE = True
|
|
27
36
|
except ImportError as e:
|
|
28
37
|
logger.warning(f"AgentMemoryManager not available: {e}")
|
|
@@ -32,33 +41,48 @@ except ImportError as e:
|
|
|
32
41
|
# Try to import socketio server with fallback handling
|
|
33
42
|
try:
|
|
34
43
|
from claude_mpm.services.socketio_server import get_socketio_server
|
|
44
|
+
|
|
35
45
|
SOCKETIO_AVAILABLE = True
|
|
36
46
|
except ImportError as e:
|
|
37
47
|
logger.debug(f"SocketIO server not available: {e}")
|
|
38
48
|
SOCKETIO_AVAILABLE = False
|
|
39
49
|
get_socketio_server = None
|
|
40
50
|
|
|
51
|
+
# Try to import event bus with fallback handling
|
|
52
|
+
try:
|
|
53
|
+
from claude_mpm.services.event_bus.event_bus import EventBus
|
|
54
|
+
|
|
55
|
+
EVENT_BUS_AVAILABLE = True
|
|
56
|
+
except ImportError as e:
|
|
57
|
+
logger.debug(f"EventBus not available: {e}")
|
|
58
|
+
EVENT_BUS_AVAILABLE = False
|
|
59
|
+
EventBus = None
|
|
60
|
+
|
|
41
61
|
|
|
42
62
|
class MemoryPreDelegationHook(PreDelegationHook):
|
|
43
63
|
"""Inject agent memory into delegation context.
|
|
44
|
-
|
|
64
|
+
|
|
45
65
|
WHY: Agents perform better when they have access to accumulated project knowledge.
|
|
46
66
|
This hook loads agent-specific memory and adds it to the delegation context,
|
|
47
67
|
allowing agents to apply learned patterns and avoid known mistakes.
|
|
48
|
-
|
|
68
|
+
|
|
49
69
|
DESIGN DECISION: Memory is injected as a clearly formatted section in the context
|
|
50
70
|
to ensure agents understand it's their accumulated knowledge, not current task info.
|
|
51
71
|
"""
|
|
52
|
-
|
|
72
|
+
|
|
53
73
|
def __init__(self, config: Config = None):
|
|
54
74
|
"""Initialize with optional config.
|
|
55
|
-
|
|
75
|
+
|
|
56
76
|
Args:
|
|
57
77
|
config: Optional Config object. If not provided, will create default Config.
|
|
58
78
|
"""
|
|
59
79
|
super().__init__(name="memory_pre_delegation", priority=20)
|
|
60
|
-
|
|
61
|
-
|
|
80
|
+
if config:
|
|
81
|
+
self.config = config
|
|
82
|
+
else:
|
|
83
|
+
config_loader = ConfigLoader()
|
|
84
|
+
self.config = config_loader.load_main_config()
|
|
85
|
+
|
|
62
86
|
# Initialize memory manager only if available
|
|
63
87
|
if MEMORY_MANAGER_AVAILABLE and AgentMemoryManager:
|
|
64
88
|
try:
|
|
@@ -69,10 +93,20 @@ class MemoryPreDelegationHook(PreDelegationHook):
|
|
|
69
93
|
else:
|
|
70
94
|
logger.info("Memory manager not available - hook will be inactive")
|
|
71
95
|
self.memory_manager = None
|
|
72
|
-
|
|
96
|
+
|
|
97
|
+
# Initialize event bus for observability
|
|
98
|
+
if EVENT_BUS_AVAILABLE and EventBus:
|
|
99
|
+
try:
|
|
100
|
+
self.event_bus = EventBus.get_instance()
|
|
101
|
+
except Exception as e:
|
|
102
|
+
logger.debug(f"Failed to get EventBus instance: {e}")
|
|
103
|
+
self.event_bus = None
|
|
104
|
+
else:
|
|
105
|
+
self.event_bus = None
|
|
106
|
+
|
|
73
107
|
def execute(self, context: HookContext) -> HookResult:
|
|
74
108
|
"""Add agent memory to delegation context.
|
|
75
|
-
|
|
109
|
+
|
|
76
110
|
WHY: By loading memory before delegation, agents can reference their
|
|
77
111
|
accumulated knowledge when performing tasks, leading to better outcomes.
|
|
78
112
|
"""
|
|
@@ -80,27 +114,33 @@ class MemoryPreDelegationHook(PreDelegationHook):
|
|
|
80
114
|
if not self.memory_manager:
|
|
81
115
|
logger.debug("Memory manager not available - skipping memory injection")
|
|
82
116
|
return HookResult(success=True, data=context.data, modified=False)
|
|
83
|
-
|
|
117
|
+
|
|
84
118
|
try:
|
|
85
119
|
# Extract and normalize agent ID from context
|
|
86
|
-
agent_name = context.data.get(
|
|
120
|
+
agent_name = context.data.get("agent", "")
|
|
87
121
|
if not agent_name:
|
|
88
122
|
return HookResult(success=True, data=context.data, modified=False)
|
|
89
|
-
|
|
123
|
+
|
|
90
124
|
# Normalize agent ID (e.g., "Engineer Agent" -> "engineer")
|
|
91
|
-
agent_id =
|
|
92
|
-
|
|
125
|
+
agent_id = (
|
|
126
|
+
agent_name.lower()
|
|
127
|
+
.replace(" ", "_")
|
|
128
|
+
.replace("_agent", "")
|
|
129
|
+
.replace("agent", "")
|
|
130
|
+
.strip("_")
|
|
131
|
+
)
|
|
132
|
+
|
|
93
133
|
if agent_id:
|
|
94
134
|
# Load agent memory
|
|
95
135
|
memory_content = self.memory_manager.load_agent_memory(agent_id)
|
|
96
|
-
|
|
136
|
+
|
|
97
137
|
if memory_content and memory_content.strip():
|
|
98
138
|
# Get existing context data
|
|
99
|
-
delegation_context = context.data.get(
|
|
139
|
+
delegation_context = context.data.get("context", {})
|
|
100
140
|
if isinstance(delegation_context, str):
|
|
101
141
|
# If context is a string, convert to dict
|
|
102
|
-
delegation_context = {
|
|
103
|
-
|
|
142
|
+
delegation_context = {"prompt": delegation_context}
|
|
143
|
+
|
|
104
144
|
# Add memory with clear formatting
|
|
105
145
|
memory_section = f"""
|
|
106
146
|
AGENT MEMORY - PROJECT-SPECIFIC KNOWLEDGE:
|
|
@@ -108,34 +148,58 @@ AGENT MEMORY - PROJECT-SPECIFIC KNOWLEDGE:
|
|
|
108
148
|
|
|
109
149
|
INSTRUCTIONS: Review your memory above before proceeding. Apply learned patterns and avoid known mistakes.
|
|
110
150
|
"""
|
|
111
|
-
|
|
151
|
+
|
|
112
152
|
# Add to context
|
|
113
|
-
delegation_context[
|
|
114
|
-
|
|
153
|
+
delegation_context["agent_memory"] = memory_section
|
|
154
|
+
|
|
115
155
|
# Update the context data
|
|
116
156
|
updated_data = context.data.copy()
|
|
117
|
-
updated_data[
|
|
118
|
-
|
|
157
|
+
updated_data["context"] = delegation_context
|
|
158
|
+
|
|
119
159
|
logger.info(f"Injected memory for agent '{agent_id}'")
|
|
120
|
-
|
|
121
|
-
#
|
|
160
|
+
|
|
161
|
+
# Calculate memory size for observability
|
|
162
|
+
memory_size = len(memory_content)
|
|
163
|
+
|
|
164
|
+
# Emit event bus event for observability
|
|
165
|
+
if self.event_bus:
|
|
166
|
+
try:
|
|
167
|
+
# Determine memory source (project or user level)
|
|
168
|
+
# This is inferred from the memory manager's behavior
|
|
169
|
+
memory_source = (
|
|
170
|
+
"runtime" # Runtime loading from memory manager
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
self.event_bus.publish(
|
|
174
|
+
"agent.memory.loaded",
|
|
175
|
+
{
|
|
176
|
+
"agent_id": agent_id,
|
|
177
|
+
"memory_source": memory_source,
|
|
178
|
+
"memory_size": memory_size,
|
|
179
|
+
"timestamp": datetime.now(datetime.UTC).isoformat(),
|
|
180
|
+
},
|
|
181
|
+
)
|
|
182
|
+
except Exception as event_error:
|
|
183
|
+
logger.debug(f"EventBus publish failed: {event_error}")
|
|
184
|
+
|
|
185
|
+
# Emit Socket.IO event for memory injected (legacy compatibility)
|
|
122
186
|
try:
|
|
123
187
|
socketio_server = get_socketio_server()
|
|
124
188
|
# Calculate size of injected content
|
|
125
|
-
injected_size = len(memory_section.encode(
|
|
189
|
+
injected_size = len(memory_section.encode("utf-8"))
|
|
126
190
|
socketio_server.memory_injected(agent_id, injected_size)
|
|
127
191
|
except Exception as ws_error:
|
|
128
192
|
logger.debug(f"Socket.IO notification failed: {ws_error}")
|
|
129
|
-
|
|
193
|
+
|
|
130
194
|
return HookResult(
|
|
131
195
|
success=True,
|
|
132
196
|
data=updated_data,
|
|
133
197
|
modified=True,
|
|
134
|
-
metadata={
|
|
198
|
+
metadata={"memory_injected": True, "agent_id": agent_id},
|
|
135
199
|
)
|
|
136
|
-
|
|
200
|
+
|
|
137
201
|
return HookResult(success=True, data=context.data, modified=False)
|
|
138
|
-
|
|
202
|
+
|
|
139
203
|
except Exception as e:
|
|
140
204
|
logger.error(f"Memory injection failed: {e}")
|
|
141
205
|
# Don't fail the delegation if memory injection fails
|
|
@@ -143,73 +207,81 @@ INSTRUCTIONS: Review your memory above before proceeding. Apply learned patterns
|
|
|
143
207
|
success=True,
|
|
144
208
|
data=context.data,
|
|
145
209
|
modified=False,
|
|
146
|
-
error=f"Memory injection failed: {
|
|
210
|
+
error=f"Memory injection failed: {e!s}",
|
|
147
211
|
)
|
|
148
212
|
|
|
149
213
|
|
|
150
214
|
class MemoryPostDelegationHook(PostDelegationHook):
|
|
151
215
|
"""Extract learnings from delegation results using explicit markers.
|
|
152
|
-
|
|
216
|
+
|
|
153
217
|
WHY: Agents produce valuable insights during task execution. This hook
|
|
154
218
|
extracts structured learnings from their outputs using explicit markers,
|
|
155
219
|
building up project-specific knowledge over time.
|
|
156
|
-
|
|
220
|
+
|
|
157
221
|
DESIGN DECISION: We use explicit markers to give agents full control over
|
|
158
222
|
what gets memorized. This is more reliable than pattern matching and allows
|
|
159
223
|
multiple learnings per response. Supports multiple trigger phrases for flexibility.
|
|
160
|
-
|
|
224
|
+
|
|
161
225
|
Supported formats:
|
|
162
226
|
# Add To Memory:
|
|
163
227
|
Type: pattern
|
|
164
228
|
Content: All services use dependency injection for flexibility
|
|
165
229
|
#
|
|
166
|
-
|
|
230
|
+
|
|
167
231
|
# Memorize:
|
|
168
232
|
Type: guideline
|
|
169
233
|
Content: Always validate input parameters before processing
|
|
170
234
|
#
|
|
171
|
-
|
|
235
|
+
|
|
172
236
|
# Remember:
|
|
173
237
|
Type: mistake
|
|
174
238
|
Content: Never hardcode configuration values
|
|
175
239
|
#
|
|
176
240
|
"""
|
|
177
|
-
|
|
241
|
+
|
|
178
242
|
def __init__(self, config: Config = None):
|
|
179
243
|
"""Initialize with optional config.
|
|
180
|
-
|
|
244
|
+
|
|
181
245
|
Args:
|
|
182
246
|
config: Optional Config object. If not provided, will create default Config.
|
|
183
247
|
"""
|
|
184
248
|
super().__init__(name="memory_post_delegation", priority=80)
|
|
185
|
-
|
|
186
|
-
|
|
249
|
+
if config:
|
|
250
|
+
self.config = config
|
|
251
|
+
else:
|
|
252
|
+
config_loader = ConfigLoader()
|
|
253
|
+
self.config = config_loader.load_main_config()
|
|
254
|
+
|
|
187
255
|
# Initialize memory manager only if available
|
|
188
256
|
if MEMORY_MANAGER_AVAILABLE and AgentMemoryManager:
|
|
189
257
|
try:
|
|
190
258
|
self.memory_manager = AgentMemoryManager(self.config)
|
|
191
259
|
except Exception as e:
|
|
192
|
-
logger.error(
|
|
260
|
+
logger.error(
|
|
261
|
+
f"Failed to initialize AgentMemoryManager in PostDelegationHook: {e}"
|
|
262
|
+
)
|
|
193
263
|
self.memory_manager = None
|
|
194
264
|
else:
|
|
195
|
-
logger.info(
|
|
265
|
+
logger.info(
|
|
266
|
+
"Memory manager not available - post-delegation hook will be inactive"
|
|
267
|
+
)
|
|
196
268
|
self.memory_manager = None
|
|
197
|
-
|
|
269
|
+
|
|
198
270
|
# Map of supported types to memory sections
|
|
199
271
|
self.type_mapping = {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
272
|
+
"pattern": "pattern", # Coding Patterns Learned
|
|
273
|
+
"architecture": "architecture", # Project Architecture
|
|
274
|
+
"guideline": "guideline", # Implementation Guidelines
|
|
275
|
+
"mistake": "mistake", # Common Mistakes to Avoid
|
|
276
|
+
"strategy": "strategy", # Effective Strategies
|
|
277
|
+
"integration": "integration", # Integration Points
|
|
278
|
+
"performance": "performance", # Performance Considerations
|
|
279
|
+
"context": "context", # Current Technical Context
|
|
208
280
|
}
|
|
209
|
-
|
|
281
|
+
|
|
210
282
|
def execute(self, context: HookContext) -> HookResult:
|
|
211
283
|
"""Extract and store learnings from delegation result.
|
|
212
|
-
|
|
284
|
+
|
|
213
285
|
WHY: Capturing learnings immediately after task completion ensures we
|
|
214
286
|
don't lose valuable insights that agents discover during execution.
|
|
215
287
|
"""
|
|
@@ -217,62 +289,74 @@ class MemoryPostDelegationHook(PostDelegationHook):
|
|
|
217
289
|
if not self.memory_manager:
|
|
218
290
|
logger.debug("Memory manager not available - skipping learning extraction")
|
|
219
291
|
return HookResult(success=True, data=context.data, modified=False)
|
|
220
|
-
|
|
292
|
+
|
|
221
293
|
try:
|
|
222
294
|
# Check if auto-learning is enabled
|
|
223
|
-
if not self.config.get(
|
|
295
|
+
if not self.config.get(
|
|
296
|
+
"memory.auto_learning", True
|
|
297
|
+
): # Changed default to True
|
|
224
298
|
return HookResult(success=True, data=context.data, modified=False)
|
|
225
|
-
|
|
299
|
+
|
|
226
300
|
# Extract agent ID
|
|
227
|
-
agent_name = context.data.get(
|
|
301
|
+
agent_name = context.data.get("agent", "")
|
|
228
302
|
if not agent_name:
|
|
229
303
|
return HookResult(success=True, data=context.data, modified=False)
|
|
230
|
-
|
|
304
|
+
|
|
231
305
|
# Normalize agent ID
|
|
232
|
-
agent_id =
|
|
233
|
-
|
|
306
|
+
agent_id = (
|
|
307
|
+
agent_name.lower()
|
|
308
|
+
.replace(" ", "_")
|
|
309
|
+
.replace("_agent", "")
|
|
310
|
+
.replace("agent", "")
|
|
311
|
+
.strip("_")
|
|
312
|
+
)
|
|
313
|
+
|
|
234
314
|
# Check if auto-learning is enabled for this specific agent
|
|
235
|
-
agent_overrides = self.config.get(
|
|
315
|
+
agent_overrides = self.config.get("memory.agent_overrides", {})
|
|
236
316
|
agent_config = agent_overrides.get(agent_id, {})
|
|
237
|
-
if
|
|
317
|
+
if "auto_learning" in agent_config and not agent_config["auto_learning"]:
|
|
238
318
|
return HookResult(success=True, data=context.data, modified=False)
|
|
239
|
-
|
|
319
|
+
|
|
240
320
|
# Extract result content
|
|
241
|
-
result = context.data.get(
|
|
321
|
+
result = context.data.get("result", {})
|
|
242
322
|
if isinstance(result, dict):
|
|
243
|
-
result_text = result.get(
|
|
323
|
+
result_text = result.get("content", "") or str(result)
|
|
244
324
|
else:
|
|
245
325
|
result_text = str(result)
|
|
246
|
-
|
|
326
|
+
|
|
247
327
|
if agent_id and result_text:
|
|
248
328
|
# Extract learnings using patterns
|
|
249
329
|
learnings = self._extract_learnings(result_text)
|
|
250
|
-
|
|
330
|
+
|
|
251
331
|
# Store each learning
|
|
252
332
|
learnings_stored = 0
|
|
253
333
|
for learning_type, items in learnings.items():
|
|
254
334
|
for item in items:
|
|
255
335
|
try:
|
|
256
|
-
self.memory_manager.add_learning(
|
|
336
|
+
self.memory_manager.add_learning(
|
|
337
|
+
agent_id, learning_type, item
|
|
338
|
+
)
|
|
257
339
|
learnings_stored += 1
|
|
258
340
|
except Exception as e:
|
|
259
341
|
logger.warning(f"Failed to store learning: {e}")
|
|
260
|
-
|
|
342
|
+
|
|
261
343
|
if learnings_stored > 0:
|
|
262
|
-
logger.info(
|
|
263
|
-
|
|
344
|
+
logger.info(
|
|
345
|
+
f"Extracted {learnings_stored} learnings for agent '{agent_id}'"
|
|
346
|
+
)
|
|
347
|
+
|
|
264
348
|
return HookResult(
|
|
265
349
|
success=True,
|
|
266
350
|
data=context.data,
|
|
267
351
|
modified=False,
|
|
268
352
|
metadata={
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
353
|
+
"learnings_extracted": learnings_stored,
|
|
354
|
+
"agent_id": agent_id,
|
|
355
|
+
},
|
|
272
356
|
)
|
|
273
|
-
|
|
357
|
+
|
|
274
358
|
return HookResult(success=True, data=context.data, modified=False)
|
|
275
|
-
|
|
359
|
+
|
|
276
360
|
except Exception as e:
|
|
277
361
|
logger.error(f"Learning extraction failed: {e}")
|
|
278
362
|
# Don't fail the delegation result if learning extraction fails
|
|
@@ -280,54 +364,58 @@ class MemoryPostDelegationHook(PostDelegationHook):
|
|
|
280
364
|
success=True,
|
|
281
365
|
data=context.data,
|
|
282
366
|
modified=False,
|
|
283
|
-
error=f"Learning extraction failed: {
|
|
367
|
+
error=f"Learning extraction failed: {e!s}",
|
|
284
368
|
)
|
|
285
|
-
|
|
369
|
+
|
|
286
370
|
def _extract_learnings(self, text: str) -> Dict[str, List[str]]:
|
|
287
371
|
"""Extract structured learnings from text using explicit markers.
|
|
288
|
-
|
|
372
|
+
|
|
289
373
|
WHY: We limit learnings to 100 characters to keep memory entries
|
|
290
374
|
concise and actionable. Longer entries tend to be less useful as
|
|
291
375
|
quick reference points.
|
|
292
|
-
|
|
376
|
+
|
|
293
377
|
DESIGN DECISION: Using explicit markers gives agents full control and makes
|
|
294
378
|
extraction reliable. We support multiple memory additions in a single response
|
|
295
379
|
and multiple trigger phrases (Add To Memory, Memorize, Remember) for flexibility.
|
|
296
|
-
|
|
380
|
+
|
|
297
381
|
Args:
|
|
298
382
|
text: The text to extract learnings from
|
|
299
|
-
|
|
383
|
+
|
|
300
384
|
Returns:
|
|
301
385
|
Dictionary mapping learning types to lists of extracted learnings
|
|
302
386
|
"""
|
|
303
|
-
learnings = {learning_type: [] for learning_type in self.type_mapping
|
|
387
|
+
learnings = {learning_type: [] for learning_type in self.type_mapping}
|
|
304
388
|
seen_learnings = set() # Avoid duplicates
|
|
305
|
-
|
|
389
|
+
|
|
306
390
|
# Pattern to find memory blocks with multiple trigger phrases
|
|
307
391
|
# Matches: # Add To Memory: / # Memorize: / # Remember:\n...\n#
|
|
308
392
|
# Only matches complete blocks with proper closing markers
|
|
309
|
-
memory_pattern = r
|
|
310
|
-
matches = re.finditer(
|
|
311
|
-
|
|
393
|
+
memory_pattern = r"#\s*(?:Add\s+To\s+Memory|Memorize|Remember):\s*\n((?:[^#](?:[^#]|#(?!\s*(?:Add\s+To\s+Memory|Memorize|Remember):))*?)?)\n\s*#\s*$"
|
|
394
|
+
matches = re.finditer(
|
|
395
|
+
memory_pattern, text, re.MULTILINE | re.DOTALL | re.IGNORECASE
|
|
396
|
+
)
|
|
397
|
+
|
|
312
398
|
for match in matches:
|
|
313
399
|
block_content = match.group(1).strip()
|
|
314
400
|
logger.debug(f"Found memory block: {block_content[:50]}...")
|
|
315
|
-
|
|
401
|
+
|
|
316
402
|
# Extract type and content from the block
|
|
317
|
-
type_match = re.search(r
|
|
318
|
-
content_match = re.search(
|
|
319
|
-
|
|
403
|
+
type_match = re.search(r"Type:\s*(\w+)", block_content, re.IGNORECASE)
|
|
404
|
+
content_match = re.search(
|
|
405
|
+
r"Content:\s*(.+)", block_content, re.IGNORECASE | re.DOTALL
|
|
406
|
+
)
|
|
407
|
+
|
|
320
408
|
if type_match and content_match:
|
|
321
409
|
learning_type = type_match.group(1).lower().strip()
|
|
322
410
|
content = content_match.group(1).strip()
|
|
323
|
-
|
|
411
|
+
|
|
324
412
|
# Clean up multi-line content - take first line if multiple
|
|
325
|
-
if
|
|
326
|
-
content = content.split(
|
|
327
|
-
|
|
413
|
+
if "\n" in content:
|
|
414
|
+
content = content.split("\n")[0].strip()
|
|
415
|
+
|
|
328
416
|
# Remove trailing punctuation
|
|
329
|
-
content = content.rstrip(
|
|
330
|
-
|
|
417
|
+
content = content.rstrip(".!?,;")
|
|
418
|
+
|
|
331
419
|
# Validate type is supported
|
|
332
420
|
if learning_type in self.type_mapping:
|
|
333
421
|
# Check content length (between 5 and 100 characters)
|
|
@@ -337,16 +425,22 @@ class MemoryPostDelegationHook(PostDelegationHook):
|
|
|
337
425
|
if normalized not in seen_learnings:
|
|
338
426
|
learnings[learning_type].append(content)
|
|
339
427
|
seen_learnings.add(normalized)
|
|
340
|
-
logger.debug(
|
|
428
|
+
logger.debug(
|
|
429
|
+
f"Extracted learning - Type: {learning_type}, Content: {content}"
|
|
430
|
+
)
|
|
341
431
|
else:
|
|
342
432
|
logger.debug(f"Skipping duplicate learning: {content}")
|
|
343
433
|
else:
|
|
344
|
-
logger.debug(
|
|
434
|
+
logger.debug(
|
|
435
|
+
f"Skipping learning - invalid length ({len(content)}): {content}"
|
|
436
|
+
)
|
|
345
437
|
else:
|
|
346
|
-
logger.warning(
|
|
438
|
+
logger.warning(
|
|
439
|
+
f"Unsupported learning type: {learning_type}. Supported types: {list(self.type_mapping.keys())}"
|
|
440
|
+
)
|
|
347
441
|
else:
|
|
348
|
-
logger.debug(
|
|
349
|
-
|
|
442
|
+
logger.debug("Invalid memory block format - missing Type or Content")
|
|
443
|
+
|
|
350
444
|
# Log summary of extracted learnings
|
|
351
445
|
total_learnings = sum(len(items) for items in learnings.values())
|
|
352
446
|
if total_learnings > 0:
|
|
@@ -354,5 +448,5 @@ class MemoryPostDelegationHook(PostDelegationHook):
|
|
|
354
448
|
for learning_type, items in learnings.items():
|
|
355
449
|
if items:
|
|
356
450
|
logger.debug(f" {learning_type}: {len(items)} items")
|
|
357
|
-
|
|
358
|
-
return learnings
|
|
451
|
+
|
|
452
|
+
return learnings
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""Session Resume Startup Hook.
|
|
2
|
+
|
|
3
|
+
WHY: This hook automatically checks for paused sessions on PM startup and displays
|
|
4
|
+
resume context to help users continue their work seamlessly.
|
|
5
|
+
|
|
6
|
+
DESIGN DECISIONS:
|
|
7
|
+
- Runs automatically on PM startup
|
|
8
|
+
- Non-blocking: doesn't prevent PM from starting if check fails
|
|
9
|
+
- Displays context to stdout for user visibility
|
|
10
|
+
- Integrates with existing session pause/resume infrastructure
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Dict, Optional
|
|
15
|
+
|
|
16
|
+
from claude_mpm.core.logger import get_logger
|
|
17
|
+
from claude_mpm.services.cli.session_resume_helper import SessionResumeHelper
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SessionResumeStartupHook:
|
|
23
|
+
"""Hook for automatic session resume detection on PM startup."""
|
|
24
|
+
|
|
25
|
+
def __init__(self, project_path: Optional[Path] = None):
|
|
26
|
+
"""Initialize the session resume hook.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
project_path: Project root path (default: current directory)
|
|
30
|
+
"""
|
|
31
|
+
self.project_path = project_path or Path.cwd()
|
|
32
|
+
self.resume_helper = SessionResumeHelper(self.project_path)
|
|
33
|
+
self._session_displayed = False
|
|
34
|
+
|
|
35
|
+
def on_pm_startup(self) -> Optional[Dict[str, Any]]:
|
|
36
|
+
"""Execute on PM startup to check for paused sessions.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Session data if paused session found, None otherwise
|
|
40
|
+
"""
|
|
41
|
+
try:
|
|
42
|
+
# Check if we already displayed a session in this process
|
|
43
|
+
if self._session_displayed:
|
|
44
|
+
logger.debug("Session already displayed, skipping")
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
# Check for paused sessions
|
|
48
|
+
session_data = self.resume_helper.check_and_display_resume_prompt()
|
|
49
|
+
|
|
50
|
+
if session_data:
|
|
51
|
+
self._session_displayed = True
|
|
52
|
+
logger.info("Paused session context displayed to user")
|
|
53
|
+
|
|
54
|
+
return session_data
|
|
55
|
+
|
|
56
|
+
except Exception as e:
|
|
57
|
+
logger.error(f"Failed to check for paused sessions: {e}", exc_info=True)
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
def get_session_count(self) -> int:
|
|
61
|
+
"""Get count of paused sessions.
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
Number of paused sessions
|
|
65
|
+
"""
|
|
66
|
+
try:
|
|
67
|
+
return self.resume_helper.get_session_count()
|
|
68
|
+
except Exception as e:
|
|
69
|
+
logger.error(f"Failed to get session count: {e}")
|
|
70
|
+
return 0
|
|
71
|
+
|
|
72
|
+
def clear_displayed_session(self, session_data: Dict[str, Any]) -> bool:
|
|
73
|
+
"""Clear a session after it has been displayed and user has acknowledged.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
session_data: Session data to clear
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
True if successfully cleared, False otherwise
|
|
80
|
+
"""
|
|
81
|
+
try:
|
|
82
|
+
return self.resume_helper.clear_session(session_data)
|
|
83
|
+
except Exception as e:
|
|
84
|
+
logger.error(f"Failed to clear session: {e}")
|
|
85
|
+
return False
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# Global hook instance
|
|
89
|
+
_session_resume_hook: Optional[SessionResumeStartupHook] = None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def get_session_resume_hook(
|
|
93
|
+
project_path: Optional[Path] = None,
|
|
94
|
+
) -> SessionResumeStartupHook:
|
|
95
|
+
"""Get or create the global session resume hook instance.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
project_path: Project root path (default: current directory)
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
SessionResumeStartupHook instance
|
|
102
|
+
"""
|
|
103
|
+
global _session_resume_hook
|
|
104
|
+
|
|
105
|
+
if _session_resume_hook is None:
|
|
106
|
+
_session_resume_hook = SessionResumeStartupHook(project_path)
|
|
107
|
+
logger.debug("Created session resume hook instance")
|
|
108
|
+
|
|
109
|
+
return _session_resume_hook
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def trigger_session_resume_check() -> Optional[Dict[str, Any]]:
|
|
113
|
+
"""Trigger a session resume check (convenience function).
|
|
114
|
+
|
|
115
|
+
This is the main entry point for PM startup integration.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
Session data if found, None otherwise
|
|
119
|
+
"""
|
|
120
|
+
hook = get_session_resume_hook()
|
|
121
|
+
return hook.on_pm_startup()
|