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,784 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
Agent Memory Manager Service
|
|
7
|
+
===========================
|
|
8
|
+
|
|
9
|
+
Manages agent memory files with size limits and validation.
|
|
10
|
+
|
|
11
|
+
This service provides:
|
|
12
|
+
- Memory file operations (load, save, validate)
|
|
13
|
+
- Size limit enforcement (80KB default)
|
|
14
|
+
- Auto-truncation when limits exceeded
|
|
15
|
+
- Default memory template creation
|
|
16
|
+
- Section management with item limits
|
|
17
|
+
- Timestamp updates
|
|
18
|
+
- Directory initialization with README
|
|
19
|
+
|
|
20
|
+
Memory files are stored in .claude-mpm/memories/ directory
|
|
21
|
+
following the naming convention: {agent_id}_memories.md
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import logging
|
|
25
|
+
from typing import Any, ClassVar, Dict, List, Optional, Tuple
|
|
26
|
+
|
|
27
|
+
from claude_mpm.core.config import Config
|
|
28
|
+
from claude_mpm.core.enums import OperationResult
|
|
29
|
+
from claude_mpm.core.interfaces import MemoryServiceInterface
|
|
30
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
31
|
+
|
|
32
|
+
from .content_manager import MemoryContentManager
|
|
33
|
+
from .memory_categorization_service import MemoryCategorizationService
|
|
34
|
+
from .memory_file_service import MemoryFileService
|
|
35
|
+
from .memory_format_service import MemoryFormatService
|
|
36
|
+
from .memory_limits_service import MemoryLimitsService
|
|
37
|
+
from .template_generator import MemoryTemplateGenerator
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class AgentMemoryManager(MemoryServiceInterface):
|
|
41
|
+
"""Manages agent memory files with size limits and validation.
|
|
42
|
+
|
|
43
|
+
WHY: Agents need to accumulate project-specific knowledge over time to become
|
|
44
|
+
more effective. This service manages persistent memory files that agents can
|
|
45
|
+
read before tasks and update with new learnings.
|
|
46
|
+
|
|
47
|
+
DESIGN DECISION: Memory files are stored in .claude-mpm/memories/ (not project root)
|
|
48
|
+
to keep them organized and separate from other project files. Files follow a
|
|
49
|
+
standardized markdown format with enforced size limits to prevent unbounded growth.
|
|
50
|
+
|
|
51
|
+
The 80KB limit (~20k tokens) balances comprehensive knowledge storage with
|
|
52
|
+
reasonable context size for agent prompts.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
# Default limits - will be overridden by configuration
|
|
56
|
+
# Updated to support 20k tokens (~80KB) for enhanced memory capacity
|
|
57
|
+
DEFAULT_MEMORY_LIMITS: ClassVar[dict[str, int]] = {
|
|
58
|
+
"max_file_size_kb": 80, # Increased from 8KB to 80KB (20k tokens)
|
|
59
|
+
"max_items": 100, # Maximum total memory items
|
|
60
|
+
"max_line_length": 120,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
def __init__(
|
|
64
|
+
self, config: Optional[Config] = None, working_directory: Optional[Path] = None
|
|
65
|
+
):
|
|
66
|
+
"""Initialize the memory manager.
|
|
67
|
+
|
|
68
|
+
Sets up the memories directory and ensures it exists with proper README.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
config: Optional Config object. If not provided, will create default Config.
|
|
72
|
+
working_directory: Optional working directory. If not provided, uses current working directory.
|
|
73
|
+
"""
|
|
74
|
+
# Initialize logger using the same pattern as LoggerMixin
|
|
75
|
+
self._logger_instance = None
|
|
76
|
+
self._logger_name = None
|
|
77
|
+
|
|
78
|
+
self.config = config or Config()
|
|
79
|
+
self.project_root = get_path_manager().project_root
|
|
80
|
+
# Use current working directory by default, not project root
|
|
81
|
+
self.working_directory = working_directory or Path(Path.cwd())
|
|
82
|
+
|
|
83
|
+
# Use only project memory directory
|
|
84
|
+
self.project_memories_dir = self.working_directory / ".claude-mpm" / "memories"
|
|
85
|
+
|
|
86
|
+
# Primary memories_dir points to project
|
|
87
|
+
self.memories_dir = self.project_memories_dir
|
|
88
|
+
|
|
89
|
+
# Initialize services
|
|
90
|
+
self.file_service = MemoryFileService(self.memories_dir)
|
|
91
|
+
self.limits_service = MemoryLimitsService(self.config)
|
|
92
|
+
self.memory_limits = self.limits_service.memory_limits
|
|
93
|
+
self.format_service = MemoryFormatService()
|
|
94
|
+
self.categorization_service = MemoryCategorizationService()
|
|
95
|
+
|
|
96
|
+
# Ensure project directory exists
|
|
97
|
+
self.file_service.ensure_memories_directory()
|
|
98
|
+
|
|
99
|
+
# Initialize component services
|
|
100
|
+
self.template_generator = MemoryTemplateGenerator(
|
|
101
|
+
self.config, self.working_directory
|
|
102
|
+
)
|
|
103
|
+
self.content_manager = MemoryContentManager(self.memory_limits)
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def logger(self):
|
|
107
|
+
"""Get or create the logger instance (like LoggerMixin)."""
|
|
108
|
+
if self._logger_instance is None:
|
|
109
|
+
if self._logger_name:
|
|
110
|
+
logger_name = self._logger_name
|
|
111
|
+
else:
|
|
112
|
+
module = self.__class__.__module__
|
|
113
|
+
class_name = self.__class__.__name__
|
|
114
|
+
|
|
115
|
+
if module and module != "__main__":
|
|
116
|
+
logger_name = f"{module}.{class_name}"
|
|
117
|
+
else:
|
|
118
|
+
logger_name = class_name
|
|
119
|
+
|
|
120
|
+
self._logger_instance = logging.getLogger(logger_name)
|
|
121
|
+
|
|
122
|
+
return self._logger_instance
|
|
123
|
+
|
|
124
|
+
def load_agent_memory(self, agent_id: str) -> str:
|
|
125
|
+
"""Load agent memory file content from project directory.
|
|
126
|
+
|
|
127
|
+
WHY: Agents need to read their accumulated knowledge before starting tasks
|
|
128
|
+
to apply learned patterns and avoid repeated mistakes. All memories are
|
|
129
|
+
now stored at the project level for consistency.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
agent_id: The agent identifier (e.g., 'PM', 'research', 'engineer')
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
str: The memory file content, creating default if doesn't exist
|
|
136
|
+
"""
|
|
137
|
+
# All agents use project directory
|
|
138
|
+
project_memory_file = self.file_service.get_memory_file_with_migration(
|
|
139
|
+
self.project_memories_dir, agent_id
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Load project-level memory if exists
|
|
143
|
+
if project_memory_file.exists():
|
|
144
|
+
try:
|
|
145
|
+
project_memory = project_memory_file.read_text(encoding="utf-8")
|
|
146
|
+
project_memory = self.content_manager.validate_and_repair(
|
|
147
|
+
project_memory, agent_id
|
|
148
|
+
)
|
|
149
|
+
self.logger.debug(f"Loaded project-level memory for {agent_id}")
|
|
150
|
+
return project_memory
|
|
151
|
+
except Exception as e:
|
|
152
|
+
self.logger.error(
|
|
153
|
+
f"Error reading project memory file for {agent_id}: {e}"
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# Memory doesn't exist - create default in project directory
|
|
157
|
+
self.logger.info(f"Creating default memory for agent: {agent_id}")
|
|
158
|
+
return self._create_default_memory(agent_id)
|
|
159
|
+
|
|
160
|
+
def update_agent_memory(self, agent_id: str, new_items: List[str]) -> bool:
|
|
161
|
+
"""Add new learning items to agent memory as a simple list.
|
|
162
|
+
|
|
163
|
+
WHY: Simplified memory system - all memories are stored as a simple list
|
|
164
|
+
without categorization, making it easier to manage and understand.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
agent_id: The agent identifier
|
|
168
|
+
new_items: List of new learning items to add
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
bool: True if update succeeded, False otherwise
|
|
172
|
+
"""
|
|
173
|
+
try:
|
|
174
|
+
# Use the simplified _add_learnings_to_memory method
|
|
175
|
+
return self._add_learnings_to_memory(agent_id, new_items)
|
|
176
|
+
except Exception as e:
|
|
177
|
+
self.logger.error(f"Error updating memory for {agent_id}: {e}")
|
|
178
|
+
# Never fail on memory errors
|
|
179
|
+
return False
|
|
180
|
+
|
|
181
|
+
def add_learning(self, agent_id: str, content: str) -> bool:
|
|
182
|
+
"""Add a learning to agent memory as a simple list item.
|
|
183
|
+
|
|
184
|
+
WHY: Simplified interface for adding single learnings without categorization.
|
|
185
|
+
This method wraps the batch update for convenience.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
agent_id: The agent identifier
|
|
189
|
+
content: The learning content
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
bool: True if learning was added successfully
|
|
193
|
+
"""
|
|
194
|
+
return self.update_agent_memory(agent_id, [content])
|
|
195
|
+
|
|
196
|
+
def _create_default_memory(self, agent_id: str) -> str:
|
|
197
|
+
"""Create project-specific default memory file for agent.
|
|
198
|
+
|
|
199
|
+
WHY: Instead of generic templates, agents need project-specific knowledge
|
|
200
|
+
from the start. This analyzes the current project and creates contextual
|
|
201
|
+
memories with actual project characteristics.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
agent_id: The agent identifier
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
str: The project-specific memory template content
|
|
208
|
+
"""
|
|
209
|
+
# Get limits for this agent
|
|
210
|
+
limits = self.limits_service.get_agent_limits(agent_id)
|
|
211
|
+
|
|
212
|
+
# Delegate to template generator
|
|
213
|
+
template = self.template_generator.create_default_memory(agent_id, limits)
|
|
214
|
+
|
|
215
|
+
# Save default file to project directory
|
|
216
|
+
try:
|
|
217
|
+
target_dir = self.memories_dir
|
|
218
|
+
memory_file = target_dir / f"{agent_id}_memories.md"
|
|
219
|
+
memory_file.write_text(template, encoding="utf-8")
|
|
220
|
+
self.logger.info(f"Created project-specific memory file for {agent_id}")
|
|
221
|
+
|
|
222
|
+
except Exception as e:
|
|
223
|
+
self.logger.error(f"Error saving default memory for {agent_id}: {e}")
|
|
224
|
+
|
|
225
|
+
return template
|
|
226
|
+
|
|
227
|
+
def optimize_memory(self, agent_id: Optional[str] = None) -> Dict[str, Any]:
|
|
228
|
+
"""Optimize agent memory by consolidating/cleaning memories.
|
|
229
|
+
|
|
230
|
+
WHY: Over time, memory files accumulate redundant or outdated information.
|
|
231
|
+
This method delegates to the memory optimizer service to clean up and
|
|
232
|
+
consolidate memories while preserving important information.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
agent_id: Optional specific agent ID. If None, optimizes all agents.
|
|
236
|
+
|
|
237
|
+
Returns:
|
|
238
|
+
Dict containing optimization results and statistics
|
|
239
|
+
"""
|
|
240
|
+
try:
|
|
241
|
+
from claude_mpm.services.memory.optimizer import MemoryOptimizer
|
|
242
|
+
|
|
243
|
+
optimizer = MemoryOptimizer(self.config, self.working_directory)
|
|
244
|
+
|
|
245
|
+
if agent_id:
|
|
246
|
+
result = optimizer.optimize_agent_memory(agent_id)
|
|
247
|
+
self.logger.info(f"Optimized memory for agent: {agent_id}")
|
|
248
|
+
else:
|
|
249
|
+
result = optimizer.optimize_all_memories()
|
|
250
|
+
self.logger.info("Optimized all agent memories")
|
|
251
|
+
|
|
252
|
+
return result
|
|
253
|
+
except Exception as e:
|
|
254
|
+
self.logger.error(f"Error optimizing memory: {e}")
|
|
255
|
+
return {"success": False, "error": str(e)}
|
|
256
|
+
|
|
257
|
+
def build_memories_from_docs(self, force_rebuild: bool = False) -> Dict[str, Any]:
|
|
258
|
+
"""Build agent memories from project documentation.
|
|
259
|
+
|
|
260
|
+
WHY: Project documentation contains valuable knowledge that should be
|
|
261
|
+
extracted and assigned to appropriate agents for better context awareness.
|
|
262
|
+
|
|
263
|
+
Args:
|
|
264
|
+
force_rebuild: If True, rebuilds even if docs haven't changed
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
Dict containing build results and statistics
|
|
268
|
+
"""
|
|
269
|
+
try:
|
|
270
|
+
from claude_mpm.services.memory.builder import MemoryBuilder
|
|
271
|
+
|
|
272
|
+
builder = MemoryBuilder(self.config, self.working_directory)
|
|
273
|
+
|
|
274
|
+
result = builder.build_from_documentation(force_rebuild)
|
|
275
|
+
self.logger.info("Built memories from documentation")
|
|
276
|
+
|
|
277
|
+
return result
|
|
278
|
+
except Exception as e:
|
|
279
|
+
self.logger.error(f"Error building memories from docs: {e}")
|
|
280
|
+
return {"success": False, "error": str(e)}
|
|
281
|
+
|
|
282
|
+
def route_memory_command(
|
|
283
|
+
self, content: str, context: Optional[Dict] = None
|
|
284
|
+
) -> Dict[str, Any]:
|
|
285
|
+
"""Route memory command to appropriate agent via PM delegation.
|
|
286
|
+
|
|
287
|
+
WHY: Memory commands like "remember this for next time" need to be analyzed
|
|
288
|
+
to determine which agent should store the information. This method provides
|
|
289
|
+
routing logic for PM agent delegation.
|
|
290
|
+
|
|
291
|
+
Args:
|
|
292
|
+
content: The content to be remembered
|
|
293
|
+
context: Optional context for routing decisions
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
Dict containing routing decision and reasoning
|
|
297
|
+
"""
|
|
298
|
+
try:
|
|
299
|
+
from claude_mpm.services.memory.router import MemoryRouter
|
|
300
|
+
|
|
301
|
+
router = MemoryRouter(self.config)
|
|
302
|
+
|
|
303
|
+
routing_result = router.analyze_and_route(content, context)
|
|
304
|
+
self.logger.debug(
|
|
305
|
+
f"Routed memory command: {routing_result['target_agent']}"
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
return routing_result
|
|
309
|
+
except Exception as e:
|
|
310
|
+
self.logger.error(f"Error routing memory command: {e}")
|
|
311
|
+
return {"success": False, "error": str(e)}
|
|
312
|
+
|
|
313
|
+
def extract_and_update_memory(self, agent_id: str, response: str) -> bool:
|
|
314
|
+
"""Extract memory updates from agent response and update memory file.
|
|
315
|
+
|
|
316
|
+
WHY: Agents provide memory updates in their responses that need to be
|
|
317
|
+
extracted and persisted. This method looks for "remember" field for incremental
|
|
318
|
+
updates or "MEMORIES" field for complete replacement.
|
|
319
|
+
|
|
320
|
+
Args:
|
|
321
|
+
agent_id: The agent identifier
|
|
322
|
+
response: The agent's response text (may contain JSON)
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
bool: True if memory was updated, False otherwise
|
|
326
|
+
"""
|
|
327
|
+
try:
|
|
328
|
+
import json
|
|
329
|
+
import re
|
|
330
|
+
|
|
331
|
+
# Log that we're processing memory for this agent
|
|
332
|
+
is_pm = agent_id.upper() == "PM"
|
|
333
|
+
self.logger.debug(f"Extracting memory for {agent_id} (is_pm={is_pm})")
|
|
334
|
+
|
|
335
|
+
# Look for JSON block in the response
|
|
336
|
+
# Pattern matches ```json ... ``` blocks
|
|
337
|
+
json_pattern = r"```json\s*(.*?)\s*```"
|
|
338
|
+
json_matches = re.findall(json_pattern, response, re.DOTALL)
|
|
339
|
+
|
|
340
|
+
if not json_matches:
|
|
341
|
+
# Also try to find inline JSON objects
|
|
342
|
+
json_pattern2 = r'\{[^{}]*"(?:remember|Remember|MEMORIES)"[^{}]*\}'
|
|
343
|
+
json_matches = re.findall(json_pattern2, response, re.DOTALL)
|
|
344
|
+
|
|
345
|
+
for json_str in json_matches:
|
|
346
|
+
try:
|
|
347
|
+
data = json.loads(json_str)
|
|
348
|
+
|
|
349
|
+
# Check for complete memory replacement in "MEMORIES" field
|
|
350
|
+
if "MEMORIES" in data and data["MEMORIES"] is not None:
|
|
351
|
+
memories = data["MEMORIES"]
|
|
352
|
+
if isinstance(memories, list) and len(memories) > 0:
|
|
353
|
+
# Filter out empty strings and None values
|
|
354
|
+
valid_items = []
|
|
355
|
+
for item in memories:
|
|
356
|
+
if item and isinstance(item, str) and item.strip():
|
|
357
|
+
# Ensure item has bullet point for consistency
|
|
358
|
+
item_text = item.strip()
|
|
359
|
+
if not item_text.startswith("-"):
|
|
360
|
+
item_text = f"- {item_text}"
|
|
361
|
+
valid_items.append(item_text)
|
|
362
|
+
|
|
363
|
+
if valid_items:
|
|
364
|
+
self.logger.info(
|
|
365
|
+
f"Replacing all memories for {agent_id} with {len(valid_items)} items"
|
|
366
|
+
)
|
|
367
|
+
success = self.replace_agent_memory(
|
|
368
|
+
agent_id, valid_items
|
|
369
|
+
)
|
|
370
|
+
if success:
|
|
371
|
+
self.logger.info(
|
|
372
|
+
f"Successfully replaced memories for {agent_id}"
|
|
373
|
+
)
|
|
374
|
+
return True
|
|
375
|
+
self.logger.error(
|
|
376
|
+
f"Failed to replace memories for {agent_id}"
|
|
377
|
+
)
|
|
378
|
+
continue # Skip checking remember field if MEMORIES was processed
|
|
379
|
+
|
|
380
|
+
# Check for incremental memory updates in "remember" field
|
|
381
|
+
memory_items = None
|
|
382
|
+
|
|
383
|
+
# Check both "remember" and "Remember" fields
|
|
384
|
+
if "remember" in data:
|
|
385
|
+
memory_items = data["remember"]
|
|
386
|
+
elif "Remember" in data:
|
|
387
|
+
memory_items = data["Remember"]
|
|
388
|
+
|
|
389
|
+
# Process memory items if found and not null
|
|
390
|
+
if (
|
|
391
|
+
memory_items is not None
|
|
392
|
+
and memory_items != "null"
|
|
393
|
+
and isinstance(memory_items, list)
|
|
394
|
+
and len(memory_items) > 0
|
|
395
|
+
):
|
|
396
|
+
# Filter out empty strings and None values
|
|
397
|
+
valid_items = []
|
|
398
|
+
for item in memory_items:
|
|
399
|
+
if item and isinstance(item, str) and item.strip():
|
|
400
|
+
valid_items.append(item.strip())
|
|
401
|
+
|
|
402
|
+
# Only proceed if we have valid items
|
|
403
|
+
if valid_items:
|
|
404
|
+
self.logger.info(
|
|
405
|
+
f"Found {len(valid_items)} memory items for {agent_id}: {valid_items[:2]}..."
|
|
406
|
+
)
|
|
407
|
+
success = self._add_learnings_to_memory(
|
|
408
|
+
agent_id, valid_items
|
|
409
|
+
)
|
|
410
|
+
if success:
|
|
411
|
+
self.logger.info(
|
|
412
|
+
f"Successfully saved {len(valid_items)} memories for {agent_id} to project directory"
|
|
413
|
+
)
|
|
414
|
+
return True
|
|
415
|
+
self.logger.error(f"Failed to save memories for {agent_id}")
|
|
416
|
+
|
|
417
|
+
except json.JSONDecodeError as je:
|
|
418
|
+
# Not valid JSON, continue to next match
|
|
419
|
+
self.logger.debug(f"JSON decode error for {agent_id}: {je}")
|
|
420
|
+
continue
|
|
421
|
+
|
|
422
|
+
self.logger.debug(f"No memory items found in response for {agent_id}")
|
|
423
|
+
return False
|
|
424
|
+
|
|
425
|
+
except Exception as e:
|
|
426
|
+
self.logger.error(
|
|
427
|
+
f"Error extracting memory from response for {agent_id}: {e}"
|
|
428
|
+
)
|
|
429
|
+
return False
|
|
430
|
+
|
|
431
|
+
def _add_learnings_to_memory(self, agent_id: str, learnings: List[str]) -> bool:
|
|
432
|
+
"""Add new learnings to agent memory as a simple list.
|
|
433
|
+
|
|
434
|
+
WHY: Simplified memory system - all memories are stored as a simple list
|
|
435
|
+
without categorization, making it easier to manage and understand.
|
|
436
|
+
Updates timestamp on every update.
|
|
437
|
+
|
|
438
|
+
Args:
|
|
439
|
+
agent_id: The agent identifier
|
|
440
|
+
learnings: List of new learning strings to add
|
|
441
|
+
|
|
442
|
+
Returns:
|
|
443
|
+
bool: True if memory was successfully updated
|
|
444
|
+
"""
|
|
445
|
+
try:
|
|
446
|
+
# Load existing memory
|
|
447
|
+
current_memory = self.load_agent_memory(agent_id)
|
|
448
|
+
|
|
449
|
+
# Parse existing memory into a simple list
|
|
450
|
+
existing_items = self.format_service.parse_memory_list(current_memory)
|
|
451
|
+
|
|
452
|
+
# Clean template placeholders if this is a fresh memory
|
|
453
|
+
existing_items = self.format_service.clean_template_placeholders_list(
|
|
454
|
+
existing_items
|
|
455
|
+
)
|
|
456
|
+
|
|
457
|
+
# Add new learnings, avoiding duplicates
|
|
458
|
+
updated = False
|
|
459
|
+
for learning in learnings:
|
|
460
|
+
if not learning or not isinstance(learning, str):
|
|
461
|
+
continue
|
|
462
|
+
|
|
463
|
+
learning = learning.strip()
|
|
464
|
+
if not learning:
|
|
465
|
+
continue
|
|
466
|
+
|
|
467
|
+
# Check for duplicates (case-insensitive)
|
|
468
|
+
normalized_learning = learning.lower()
|
|
469
|
+
# Strip bullet points from existing items for comparison
|
|
470
|
+
existing_normalized = [
|
|
471
|
+
item.lstrip("- ").strip().lower() for item in existing_items
|
|
472
|
+
]
|
|
473
|
+
|
|
474
|
+
if normalized_learning not in existing_normalized:
|
|
475
|
+
# Add bullet point if not present
|
|
476
|
+
if not learning.startswith("-"):
|
|
477
|
+
learning = f"- {learning}"
|
|
478
|
+
existing_items.append(learning)
|
|
479
|
+
self.logger.info(
|
|
480
|
+
f"Added new memory for {agent_id}: {learning[:50]}..."
|
|
481
|
+
)
|
|
482
|
+
updated = True
|
|
483
|
+
else:
|
|
484
|
+
self.logger.debug(
|
|
485
|
+
f"Skipping duplicate memory for {agent_id}: {learning}"
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
# Only save if we actually added new items
|
|
489
|
+
if not updated:
|
|
490
|
+
self.logger.debug(f"No new memories to add for {agent_id}")
|
|
491
|
+
return True # Not an error, just nothing new to add
|
|
492
|
+
|
|
493
|
+
# Rebuild memory content as simple list with updated timestamp
|
|
494
|
+
new_content = self.format_service.build_simple_memory_content(
|
|
495
|
+
agent_id, existing_items
|
|
496
|
+
)
|
|
497
|
+
|
|
498
|
+
# Validate and save
|
|
499
|
+
agent_limits = self.limits_service.get_agent_limits(agent_id)
|
|
500
|
+
if self.content_manager.exceeds_limits(new_content, agent_limits):
|
|
501
|
+
self.logger.debug(f"Memory for {agent_id} exceeds limits, truncating")
|
|
502
|
+
new_content = self.content_manager.truncate_simple_list(
|
|
503
|
+
new_content, agent_limits
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
# All memories go to project directory
|
|
507
|
+
return self._save_memory_file_wrapper(agent_id, new_content)
|
|
508
|
+
|
|
509
|
+
except Exception as e:
|
|
510
|
+
self.logger.error(f"Error adding learnings to memory for {agent_id}: {e}")
|
|
511
|
+
return False
|
|
512
|
+
|
|
513
|
+
def replace_agent_memory(self, agent_id: str, memory_items: List[str]) -> bool:
|
|
514
|
+
"""Replace agent's memory with new content as a simple list.
|
|
515
|
+
|
|
516
|
+
WHY: When agents provide complete memory updates through MEMORIES field,
|
|
517
|
+
they replace the existing memory rather than appending to it.
|
|
518
|
+
This ensures memories stay current and relevant.
|
|
519
|
+
|
|
520
|
+
Args:
|
|
521
|
+
agent_id: The agent identifier
|
|
522
|
+
memory_items: List of memory items to replace existing memories
|
|
523
|
+
|
|
524
|
+
Returns:
|
|
525
|
+
bool: True if memory was successfully replaced
|
|
526
|
+
"""
|
|
527
|
+
try:
|
|
528
|
+
# Build new memory content as simple list with updated timestamp
|
|
529
|
+
new_content = self.format_service.build_simple_memory_content(
|
|
530
|
+
agent_id, memory_items
|
|
531
|
+
)
|
|
532
|
+
|
|
533
|
+
# Validate and save
|
|
534
|
+
agent_limits = self.limits_service.get_agent_limits(agent_id)
|
|
535
|
+
if self.content_manager.exceeds_limits(new_content, agent_limits):
|
|
536
|
+
self.logger.debug(f"Memory for {agent_id} exceeds limits, truncating")
|
|
537
|
+
new_content = self.content_manager.truncate_simple_list(
|
|
538
|
+
new_content, agent_limits
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
# Save the new memory
|
|
542
|
+
return self._save_memory_file_wrapper(agent_id, new_content)
|
|
543
|
+
|
|
544
|
+
except Exception as e:
|
|
545
|
+
self.logger.error(f"Error replacing memory for {agent_id}: {e}")
|
|
546
|
+
return False
|
|
547
|
+
|
|
548
|
+
def get_memory_status(self) -> Dict[str, Any]:
|
|
549
|
+
"""Get comprehensive memory system status.
|
|
550
|
+
|
|
551
|
+
WHY: Provides detailed overview of memory system health, file sizes,
|
|
552
|
+
optimization opportunities, and agent-specific statistics for monitoring
|
|
553
|
+
and maintenance purposes.
|
|
554
|
+
|
|
555
|
+
Returns:
|
|
556
|
+
Dict containing comprehensive memory system status
|
|
557
|
+
"""
|
|
558
|
+
# Simplified status implementation without analyzer
|
|
559
|
+
status = {
|
|
560
|
+
"system_enabled": self.memory_enabled,
|
|
561
|
+
"auto_learning": self.auto_learning,
|
|
562
|
+
"memory_directory": str(self.memories_dir),
|
|
563
|
+
"total_agents": 0,
|
|
564
|
+
"total_size_kb": 0,
|
|
565
|
+
"agents": {},
|
|
566
|
+
"system_health": "healthy",
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
if self.memories_dir.exists():
|
|
570
|
+
memory_files = list(self.memories_dir.glob("*_memories.md"))
|
|
571
|
+
status["total_agents"] = len(memory_files)
|
|
572
|
+
|
|
573
|
+
for file_path in memory_files:
|
|
574
|
+
if file_path.name != "README.md":
|
|
575
|
+
size_kb = file_path.stat().st_size / 1024
|
|
576
|
+
status["total_size_kb"] += size_kb
|
|
577
|
+
agent_id = file_path.stem.replace("_memories", "")
|
|
578
|
+
status["agents"][agent_id] = {
|
|
579
|
+
"file": file_path.name,
|
|
580
|
+
"size_kb": round(size_kb, 2),
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
return status
|
|
584
|
+
|
|
585
|
+
def cross_reference_memories(self, query: Optional[str] = None) -> Dict[str, Any]:
|
|
586
|
+
"""Find common patterns and cross-references across agent memories.
|
|
587
|
+
|
|
588
|
+
WHY: Different agents may have learned similar or related information.
|
|
589
|
+
Cross-referencing helps identify knowledge gaps, redundancies, and
|
|
590
|
+
opportunities for knowledge sharing between agents.
|
|
591
|
+
|
|
592
|
+
Args:
|
|
593
|
+
query: Optional query to filter cross-references
|
|
594
|
+
|
|
595
|
+
Returns:
|
|
596
|
+
Dict containing cross-reference analysis results
|
|
597
|
+
"""
|
|
598
|
+
# Deprecated - return informative message
|
|
599
|
+
return {
|
|
600
|
+
"status": OperationResult.ERROR, # Deprecated function - calling it is an error
|
|
601
|
+
"message": "Cross-reference analysis has been deprecated in favor of simplified memory management",
|
|
602
|
+
"suggestion": "Use get_memory_status() for memory overview",
|
|
603
|
+
"deprecated": True,
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
def get_all_memories_raw(self) -> Dict[str, Any]:
|
|
607
|
+
"""Get all agent memories in structured JSON format.
|
|
608
|
+
|
|
609
|
+
WHY: This provides programmatic access to all agent memories, allowing
|
|
610
|
+
external tools, scripts, or APIs to retrieve and process the complete
|
|
611
|
+
memory state of the system.
|
|
612
|
+
|
|
613
|
+
Returns:
|
|
614
|
+
Dict containing structured memory data for all agents
|
|
615
|
+
"""
|
|
616
|
+
# Deprecated - return informative message
|
|
617
|
+
return {
|
|
618
|
+
"status": OperationResult.ERROR, # Deprecated function - calling it is an error
|
|
619
|
+
"message": "Raw memory access has been deprecated in favor of simplified memory management",
|
|
620
|
+
"suggestion": "Use load_agent_memory() for specific agent memories",
|
|
621
|
+
"deprecated": True,
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
def _save_memory_file_wrapper(self, agent_id: str, content: str) -> bool:
|
|
625
|
+
"""Wrapper for save_memory_file that handles agent_id.
|
|
626
|
+
|
|
627
|
+
Args:
|
|
628
|
+
agent_id: Agent identifier
|
|
629
|
+
content: Content to save
|
|
630
|
+
|
|
631
|
+
Returns:
|
|
632
|
+
True if saved successfully
|
|
633
|
+
"""
|
|
634
|
+
file_path = self.file_service.get_memory_file_with_migration(
|
|
635
|
+
self.memories_dir, agent_id
|
|
636
|
+
)
|
|
637
|
+
return self.file_service.save_memory_file(file_path, content)
|
|
638
|
+
|
|
639
|
+
def load_memory(self, agent_id: str) -> Optional[str]:
|
|
640
|
+
"""Load memory for a specific agent.
|
|
641
|
+
|
|
642
|
+
WHY: This adapter method provides interface compliance by wrapping
|
|
643
|
+
the existing load_agent_memory method.
|
|
644
|
+
|
|
645
|
+
Args:
|
|
646
|
+
agent_id: Identifier of the agent
|
|
647
|
+
|
|
648
|
+
Returns:
|
|
649
|
+
Memory content as string or None if not found
|
|
650
|
+
"""
|
|
651
|
+
try:
|
|
652
|
+
content = self.load_agent_memory(agent_id)
|
|
653
|
+
return content if content else None
|
|
654
|
+
except Exception as e:
|
|
655
|
+
self.logger.error(f"Failed to load memory for {agent_id}: {e}")
|
|
656
|
+
return None
|
|
657
|
+
|
|
658
|
+
def save_memory(self, agent_id: str, content: str) -> bool:
|
|
659
|
+
"""Save memory for a specific agent.
|
|
660
|
+
|
|
661
|
+
WHY: This adapter method provides interface compliance. The existing
|
|
662
|
+
implementation uses update_agent_memory for modifications, so we
|
|
663
|
+
implement a full save by writing directly to the file.
|
|
664
|
+
|
|
665
|
+
Args:
|
|
666
|
+
agent_id: Identifier of the agent
|
|
667
|
+
content: Memory content to save
|
|
668
|
+
|
|
669
|
+
Returns:
|
|
670
|
+
True if save successful
|
|
671
|
+
"""
|
|
672
|
+
try:
|
|
673
|
+
memory_path = self.memories_dir / f"{agent_id}_memories.md"
|
|
674
|
+
|
|
675
|
+
# Validate size before saving
|
|
676
|
+
is_valid, error_msg = self.validate_memory_size(content)
|
|
677
|
+
if not is_valid:
|
|
678
|
+
self.logger.error(f"Memory validation failed: {error_msg}")
|
|
679
|
+
return False
|
|
680
|
+
|
|
681
|
+
# Write the content
|
|
682
|
+
memory_path.write_text(content, encoding="utf-8")
|
|
683
|
+
self.logger.info(f"Saved memory for agent {agent_id}")
|
|
684
|
+
return True
|
|
685
|
+
|
|
686
|
+
except Exception as e:
|
|
687
|
+
self.logger.error(f"Failed to save memory for {agent_id}: {e}")
|
|
688
|
+
return False
|
|
689
|
+
|
|
690
|
+
def validate_memory_size(self, content: str) -> Tuple[bool, Optional[str]]:
|
|
691
|
+
"""Validate memory content size and structure.
|
|
692
|
+
|
|
693
|
+
WHY: This adapter method provides interface compliance by implementing
|
|
694
|
+
validation based on configured limits.
|
|
695
|
+
|
|
696
|
+
Args:
|
|
697
|
+
content: Memory content to validate
|
|
698
|
+
|
|
699
|
+
Returns:
|
|
700
|
+
Tuple of (is_valid, error_message)
|
|
701
|
+
"""
|
|
702
|
+
return self.content_manager.validate_memory_size(content)
|
|
703
|
+
|
|
704
|
+
def get_memory_metrics(self, agent_id: Optional[str] = None) -> Dict[str, Any]:
|
|
705
|
+
"""Get memory usage metrics.
|
|
706
|
+
|
|
707
|
+
WHY: This adapter method provides interface compliance by gathering
|
|
708
|
+
metrics about memory usage.
|
|
709
|
+
|
|
710
|
+
Args:
|
|
711
|
+
agent_id: Optional specific agent ID, or None for all
|
|
712
|
+
|
|
713
|
+
Returns:
|
|
714
|
+
Dictionary with memory metrics
|
|
715
|
+
"""
|
|
716
|
+
# Minimal implementation for interface compliance
|
|
717
|
+
metrics = {"total_memory_kb": 0, "agent_count": 0, "agents": {}}
|
|
718
|
+
|
|
719
|
+
if self.memories_dir.exists():
|
|
720
|
+
if agent_id:
|
|
721
|
+
# Metrics for specific agent
|
|
722
|
+
memory_file = self.memories_dir / f"{agent_id}_memories.md"
|
|
723
|
+
if memory_file.exists():
|
|
724
|
+
size_kb = memory_file.stat().st_size / 1024
|
|
725
|
+
metrics["agents"][agent_id] = {
|
|
726
|
+
"size_kb": round(size_kb, 2),
|
|
727
|
+
"limit_kb": self.limits_service.get_agent_limits(agent_id)[
|
|
728
|
+
"max_file_size_kb"
|
|
729
|
+
],
|
|
730
|
+
"usage_percent": round(
|
|
731
|
+
(
|
|
732
|
+
size_kb
|
|
733
|
+
/ self.limits_service.get_agent_limits(agent_id)[
|
|
734
|
+
"max_file_size_kb"
|
|
735
|
+
]
|
|
736
|
+
)
|
|
737
|
+
* 100,
|
|
738
|
+
1,
|
|
739
|
+
),
|
|
740
|
+
}
|
|
741
|
+
metrics["total_memory_kb"] = round(size_kb, 2)
|
|
742
|
+
metrics["agent_count"] = 1
|
|
743
|
+
else:
|
|
744
|
+
# Metrics for all agents
|
|
745
|
+
memory_files = list(self.memories_dir.glob("*_memories.md"))
|
|
746
|
+
for file_path in memory_files:
|
|
747
|
+
if file_path.name != "README.md":
|
|
748
|
+
agent_name = file_path.stem.replace("_memories", "")
|
|
749
|
+
size_kb = file_path.stat().st_size / 1024
|
|
750
|
+
limit_kb = self.limits_service.get_agent_limits(agent_name)[
|
|
751
|
+
"max_file_size_kb"
|
|
752
|
+
]
|
|
753
|
+
metrics["agents"][agent_name] = {
|
|
754
|
+
"size_kb": round(size_kb, 2),
|
|
755
|
+
"limit_kb": limit_kb,
|
|
756
|
+
"usage_percent": round((size_kb / limit_kb) * 100, 1),
|
|
757
|
+
}
|
|
758
|
+
metrics["total_memory_kb"] += size_kb
|
|
759
|
+
|
|
760
|
+
metrics["total_memory_kb"] = round(metrics["total_memory_kb"], 2)
|
|
761
|
+
metrics["agent_count"] = len(metrics["agents"])
|
|
762
|
+
|
|
763
|
+
return metrics
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
# Convenience functions for external use
|
|
767
|
+
def get_memory_manager(
|
|
768
|
+
config: Optional[Config] = None, working_directory: Optional[Path] = None
|
|
769
|
+
) -> AgentMemoryManager:
|
|
770
|
+
"""Get a singleton instance of the memory manager.
|
|
771
|
+
|
|
772
|
+
WHY: The memory manager should be shared across the application to ensure
|
|
773
|
+
consistent file access and avoid multiple instances managing the same files.
|
|
774
|
+
|
|
775
|
+
Args:
|
|
776
|
+
config: Optional Config object. Only used on first instantiation.
|
|
777
|
+
working_directory: Optional working directory. Only used on first instantiation.
|
|
778
|
+
|
|
779
|
+
Returns:
|
|
780
|
+
AgentMemoryManager: The memory manager instance
|
|
781
|
+
"""
|
|
782
|
+
if not hasattr(get_memory_manager, "_instance"):
|
|
783
|
+
get_memory_manager._instance = AgentMemoryManager(config, working_directory)
|
|
784
|
+
return get_memory_manager._instance
|