claude-mpm 3.4.10__py3-none-any.whl → 5.4.55__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/BUILD_NUMBER +1 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +290 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1402 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +90 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2503 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +2654 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1246 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +297 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1947 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +644 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1743 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +132 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +278 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +483 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +570 -0
- claude_mpm/core/unified_paths.py +941 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +201 -107
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1369 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1202 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +707 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1324 -0
- claude_mpm/services/skills/selective_skill_deployer.py +744 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1090 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +823 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.55.dist-info/METADATA +999 -0
- claude_mpm-5.4.55.dist-info/RECORD +868 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.55.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.55.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/top_level.txt +0 -0
|
@@ -8,7 +8,7 @@ and reorganizing by priority/relevance.
|
|
|
8
8
|
|
|
9
9
|
This service provides:
|
|
10
10
|
- Duplicate detection and removal
|
|
11
|
-
- Related item consolidation
|
|
11
|
+
- Related item consolidation
|
|
12
12
|
- Priority-based reorganization
|
|
13
13
|
- Per-agent optimization strategies
|
|
14
14
|
- Size optimization within limits
|
|
@@ -23,379 +23,400 @@ information than lose important insights.
|
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
25
|
import re
|
|
26
|
-
import
|
|
27
|
-
from pathlib import Path
|
|
28
|
-
from typing import Dict, List, Optional, Any, Set, Tuple
|
|
29
|
-
from datetime import datetime
|
|
26
|
+
from datetime import datetime, timezone
|
|
30
27
|
from difflib import SequenceMatcher
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
31
30
|
|
|
32
|
-
from claude_mpm.core import LoggerMixin
|
|
33
31
|
from claude_mpm.core.config import Config
|
|
34
|
-
from claude_mpm.
|
|
32
|
+
from claude_mpm.core.mixins import LoggerMixin
|
|
33
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
35
34
|
|
|
36
35
|
|
|
37
36
|
class MemoryOptimizer(LoggerMixin):
|
|
38
37
|
"""Optimizes agent memory files through deduplication and reorganization.
|
|
39
|
-
|
|
38
|
+
|
|
40
39
|
WHY: Memory files need maintenance to stay useful. This service provides
|
|
41
40
|
automated cleanup while preserving valuable information and maintaining
|
|
42
41
|
the structured format agents expect.
|
|
43
|
-
|
|
42
|
+
|
|
44
43
|
DESIGN DECISION: Uses similarity thresholds and conservative merging to
|
|
45
44
|
avoid losing important nuances in learnings while removing clear duplicates.
|
|
46
45
|
"""
|
|
47
|
-
|
|
46
|
+
|
|
48
47
|
# Similarity threshold for considering items duplicates
|
|
49
48
|
SIMILARITY_THRESHOLD = 0.85
|
|
50
|
-
|
|
49
|
+
|
|
51
50
|
# Minimum similarity for consolidation
|
|
52
51
|
CONSOLIDATION_THRESHOLD = 0.70
|
|
53
|
-
|
|
52
|
+
|
|
54
53
|
# Priority keywords for sorting (higher priority items kept/moved up)
|
|
55
54
|
PRIORITY_KEYWORDS = {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
"high": [
|
|
56
|
+
"critical",
|
|
57
|
+
"important",
|
|
58
|
+
"essential",
|
|
59
|
+
"required",
|
|
60
|
+
"must",
|
|
61
|
+
"always",
|
|
62
|
+
"never",
|
|
63
|
+
],
|
|
64
|
+
"medium": ["should", "recommended", "prefer", "avoid", "consider"],
|
|
65
|
+
"low": ["note", "tip", "hint", "example", "reference"],
|
|
59
66
|
}
|
|
60
|
-
|
|
61
|
-
def __init__(
|
|
67
|
+
|
|
68
|
+
def __init__(
|
|
69
|
+
self, config: Optional[Config] = None, working_directory: Optional[Path] = None
|
|
70
|
+
):
|
|
62
71
|
"""Initialize the memory optimizer.
|
|
63
|
-
|
|
72
|
+
|
|
64
73
|
Args:
|
|
65
74
|
config: Optional Config object
|
|
66
75
|
working_directory: Optional working directory. If not provided, uses current working directory.
|
|
67
76
|
"""
|
|
68
77
|
super().__init__()
|
|
69
78
|
self.config = config or Config()
|
|
70
|
-
self.project_root =
|
|
79
|
+
self.project_root = get_path_manager().get_project_root()
|
|
71
80
|
# Use current working directory by default, not project root
|
|
72
|
-
self.working_directory = working_directory or Path(
|
|
81
|
+
self.working_directory = working_directory or Path(Path.cwd())
|
|
73
82
|
self.memories_dir = self.working_directory / ".claude-mpm" / "memories"
|
|
74
|
-
|
|
83
|
+
|
|
75
84
|
def optimize_agent_memory(self, agent_id: str) -> Dict[str, Any]:
|
|
76
85
|
"""Optimize memory for a specific agent.
|
|
77
|
-
|
|
86
|
+
|
|
78
87
|
WHY: Individual agent memories can be optimized independently, allowing
|
|
79
88
|
for targeted cleanup of specific agents without affecting others.
|
|
80
|
-
|
|
89
|
+
|
|
81
90
|
Args:
|
|
82
91
|
agent_id: The agent identifier
|
|
83
|
-
|
|
92
|
+
|
|
84
93
|
Returns:
|
|
85
94
|
Dict containing optimization results and statistics
|
|
86
95
|
"""
|
|
87
96
|
try:
|
|
88
97
|
memory_file = self.memories_dir / f"{agent_id}_agent.md"
|
|
89
|
-
|
|
98
|
+
|
|
90
99
|
if not memory_file.exists():
|
|
91
100
|
return {
|
|
92
101
|
"success": False,
|
|
93
102
|
"agent_id": agent_id,
|
|
94
|
-
"error": "Memory file not found"
|
|
103
|
+
"error": "Memory file not found",
|
|
95
104
|
}
|
|
96
|
-
|
|
105
|
+
|
|
97
106
|
# Load original content
|
|
98
|
-
original_content = memory_file.read_text(encoding=
|
|
107
|
+
original_content = memory_file.read_text(encoding="utf-8")
|
|
99
108
|
original_size = len(original_content)
|
|
100
|
-
|
|
109
|
+
|
|
101
110
|
# Parse memory structure
|
|
102
111
|
sections = self._parse_memory_sections(original_content)
|
|
103
|
-
|
|
112
|
+
|
|
104
113
|
# Optimize each section
|
|
105
114
|
optimized_sections = {}
|
|
106
115
|
optimization_stats = {
|
|
107
116
|
"duplicates_removed": 0,
|
|
108
117
|
"items_consolidated": 0,
|
|
109
118
|
"items_reordered": 0,
|
|
110
|
-
"sections_optimized": 0
|
|
119
|
+
"sections_optimized": 0,
|
|
111
120
|
}
|
|
112
|
-
|
|
121
|
+
|
|
113
122
|
for section_name, items in sections.items():
|
|
114
|
-
if section_name.lower() in [
|
|
123
|
+
if section_name.lower() in ["header", "metadata"]:
|
|
115
124
|
# Preserve header sections as-is
|
|
116
125
|
optimized_sections[section_name] = items
|
|
117
126
|
continue
|
|
118
|
-
|
|
127
|
+
|
|
119
128
|
optimized_items, section_stats = self._optimize_section(items, agent_id)
|
|
120
129
|
optimized_sections[section_name] = optimized_items
|
|
121
|
-
|
|
130
|
+
|
|
122
131
|
# Aggregate stats
|
|
123
132
|
for key in optimization_stats:
|
|
124
133
|
if key in section_stats:
|
|
125
134
|
optimization_stats[key] += section_stats[key]
|
|
126
|
-
|
|
127
|
-
if
|
|
135
|
+
|
|
136
|
+
if (
|
|
137
|
+
section_stats.get("duplicates_removed", 0) > 0
|
|
138
|
+
or section_stats.get("items_consolidated", 0) > 0
|
|
139
|
+
):
|
|
128
140
|
optimization_stats["sections_optimized"] += 1
|
|
129
|
-
|
|
141
|
+
|
|
130
142
|
# Rebuild memory content
|
|
131
|
-
optimized_content = self._rebuild_memory_content(
|
|
143
|
+
optimized_content = self._rebuild_memory_content(
|
|
144
|
+
optimized_sections, agent_id
|
|
145
|
+
)
|
|
132
146
|
optimized_size = len(optimized_content)
|
|
133
|
-
|
|
147
|
+
|
|
134
148
|
# Create backup before saving
|
|
135
149
|
backup_path = self._create_backup(memory_file)
|
|
136
|
-
|
|
150
|
+
|
|
137
151
|
# Save optimized content
|
|
138
|
-
memory_file.write_text(optimized_content, encoding=
|
|
139
|
-
|
|
152
|
+
memory_file.write_text(optimized_content, encoding="utf-8")
|
|
153
|
+
|
|
140
154
|
result = {
|
|
141
155
|
"success": True,
|
|
142
156
|
"agent_id": agent_id,
|
|
143
157
|
"original_size": original_size,
|
|
144
158
|
"optimized_size": optimized_size,
|
|
145
159
|
"size_reduction": original_size - optimized_size,
|
|
146
|
-
"size_reduction_percent":
|
|
160
|
+
"size_reduction_percent": (
|
|
161
|
+
round(((original_size - optimized_size) / original_size) * 100, 1)
|
|
162
|
+
if original_size > 0
|
|
163
|
+
else 0
|
|
164
|
+
),
|
|
147
165
|
"backup_created": str(backup_path),
|
|
148
|
-
"timestamp": datetime.now().isoformat(),
|
|
149
|
-
**optimization_stats
|
|
166
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
167
|
+
**optimization_stats,
|
|
150
168
|
}
|
|
151
|
-
|
|
169
|
+
|
|
152
170
|
self.logger.info(f"Optimized memory for {agent_id}: {optimization_stats}")
|
|
153
171
|
return result
|
|
154
|
-
|
|
172
|
+
|
|
155
173
|
except Exception as e:
|
|
156
174
|
self.logger.error(f"Error optimizing memory for {agent_id}: {e}")
|
|
157
|
-
return {
|
|
158
|
-
|
|
159
|
-
"agent_id": agent_id,
|
|
160
|
-
"error": str(e)
|
|
161
|
-
}
|
|
162
|
-
|
|
175
|
+
return {"success": False, "agent_id": agent_id, "error": str(e)}
|
|
176
|
+
|
|
163
177
|
def optimize_all_memories(self) -> Dict[str, Any]:
|
|
164
178
|
"""Optimize all agent memory files.
|
|
165
|
-
|
|
179
|
+
|
|
166
180
|
WHY: Bulk optimization allows maintenance of the entire memory system
|
|
167
181
|
in one operation, providing comprehensive cleanup and consistency.
|
|
168
|
-
|
|
182
|
+
|
|
169
183
|
Returns:
|
|
170
184
|
Dict containing results for all agents
|
|
171
185
|
"""
|
|
172
186
|
try:
|
|
173
187
|
if not self.memories_dir.exists():
|
|
174
|
-
return {
|
|
175
|
-
|
|
176
|
-
"error": "Memory directory not found"
|
|
177
|
-
}
|
|
178
|
-
|
|
188
|
+
return {"success": False, "error": "Memory directory not found"}
|
|
189
|
+
|
|
179
190
|
memory_files = list(self.memories_dir.glob("*_agent.md"))
|
|
180
191
|
results = {}
|
|
181
|
-
|
|
192
|
+
|
|
182
193
|
total_stats = {
|
|
183
194
|
"agents_processed": 0,
|
|
184
195
|
"agents_optimized": 0,
|
|
185
196
|
"total_size_before": 0,
|
|
186
197
|
"total_size_after": 0,
|
|
187
198
|
"total_duplicates_removed": 0,
|
|
188
|
-
"total_items_consolidated": 0
|
|
199
|
+
"total_items_consolidated": 0,
|
|
189
200
|
}
|
|
190
|
-
|
|
201
|
+
|
|
191
202
|
for memory_file in memory_files:
|
|
192
|
-
agent_id = memory_file.stem.replace(
|
|
203
|
+
agent_id = memory_file.stem.replace("_agent", "")
|
|
193
204
|
result = self.optimize_agent_memory(agent_id)
|
|
194
205
|
results[agent_id] = result
|
|
195
|
-
|
|
206
|
+
|
|
196
207
|
total_stats["agents_processed"] += 1
|
|
197
|
-
|
|
208
|
+
|
|
198
209
|
if result.get("success"):
|
|
199
210
|
total_stats["agents_optimized"] += 1
|
|
200
211
|
total_stats["total_size_before"] += result.get("original_size", 0)
|
|
201
212
|
total_stats["total_size_after"] += result.get("optimized_size", 0)
|
|
202
|
-
total_stats["total_duplicates_removed"] += result.get(
|
|
203
|
-
|
|
204
|
-
|
|
213
|
+
total_stats["total_duplicates_removed"] += result.get(
|
|
214
|
+
"duplicates_removed", 0
|
|
215
|
+
)
|
|
216
|
+
total_stats["total_items_consolidated"] += result.get(
|
|
217
|
+
"items_consolidated", 0
|
|
218
|
+
)
|
|
219
|
+
|
|
205
220
|
# Calculate overall statistics
|
|
206
|
-
total_reduction =
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
221
|
+
total_reduction = (
|
|
222
|
+
total_stats["total_size_before"] - total_stats["total_size_after"]
|
|
223
|
+
)
|
|
224
|
+
total_reduction_percent = (
|
|
225
|
+
round((total_reduction / total_stats["total_size_before"]) * 100, 1)
|
|
226
|
+
if total_stats["total_size_before"] > 0
|
|
227
|
+
else 0
|
|
228
|
+
)
|
|
229
|
+
|
|
211
230
|
return {
|
|
212
231
|
"success": True,
|
|
213
|
-
"timestamp": datetime.now().isoformat(),
|
|
232
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
214
233
|
"agents": results,
|
|
215
234
|
"summary": {
|
|
216
235
|
**total_stats,
|
|
217
236
|
"total_size_reduction": total_reduction,
|
|
218
|
-
"total_size_reduction_percent": total_reduction_percent
|
|
219
|
-
}
|
|
237
|
+
"total_size_reduction_percent": total_reduction_percent,
|
|
238
|
+
},
|
|
220
239
|
}
|
|
221
|
-
|
|
240
|
+
|
|
222
241
|
except Exception as e:
|
|
223
242
|
self.logger.error(f"Error optimizing all memories: {e}")
|
|
224
|
-
return {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
def analyze_optimization_opportunities(self, agent_id: Optional[str] = None) -> Dict[str, Any]:
|
|
243
|
+
return {"success": False, "error": str(e)}
|
|
244
|
+
|
|
245
|
+
def analyze_optimization_opportunities(
|
|
246
|
+
self, agent_id: Optional[str] = None
|
|
247
|
+
) -> Dict[str, Any]:
|
|
230
248
|
"""Analyze potential optimization opportunities without making changes.
|
|
231
|
-
|
|
249
|
+
|
|
232
250
|
WHY: Users may want to understand what optimizations would be performed
|
|
233
251
|
before actually running them, allowing for informed decisions.
|
|
234
|
-
|
|
252
|
+
|
|
235
253
|
Args:
|
|
236
254
|
agent_id: Optional specific agent to analyze
|
|
237
|
-
|
|
255
|
+
|
|
238
256
|
Returns:
|
|
239
257
|
Dict containing analysis results
|
|
240
258
|
"""
|
|
241
259
|
try:
|
|
242
260
|
if agent_id:
|
|
243
261
|
return self._analyze_single_agent(agent_id)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
262
|
+
return self._analyze_all_agents()
|
|
263
|
+
|
|
247
264
|
except Exception as e:
|
|
248
265
|
self.logger.error(f"Error analyzing optimization opportunities: {e}")
|
|
249
266
|
return {"success": False, "error": str(e)}
|
|
250
|
-
|
|
267
|
+
|
|
251
268
|
def _parse_memory_sections(self, content: str) -> Dict[str, List[str]]:
|
|
252
269
|
"""Parse memory content into sections and items.
|
|
253
|
-
|
|
270
|
+
|
|
254
271
|
Args:
|
|
255
272
|
content: Memory file content
|
|
256
|
-
|
|
273
|
+
|
|
257
274
|
Returns:
|
|
258
275
|
Dict mapping section names to lists of items
|
|
259
276
|
"""
|
|
260
|
-
lines = content.split(
|
|
277
|
+
lines = content.split("\n")
|
|
261
278
|
sections = {}
|
|
262
|
-
current_section =
|
|
279
|
+
current_section = "header"
|
|
263
280
|
current_items = []
|
|
264
|
-
|
|
281
|
+
|
|
265
282
|
for line in lines:
|
|
266
|
-
if line.startswith(
|
|
283
|
+
if line.startswith("## "):
|
|
267
284
|
# Save previous section
|
|
268
285
|
if current_section:
|
|
269
286
|
sections[current_section] = current_items
|
|
270
|
-
|
|
287
|
+
|
|
271
288
|
# Start new section
|
|
272
|
-
section_name = line[3:].split(
|
|
289
|
+
section_name = line[3:].split("(")[0].strip()
|
|
273
290
|
current_section = section_name
|
|
274
291
|
current_items = [line] # Include the header
|
|
275
|
-
|
|
292
|
+
|
|
276
293
|
else:
|
|
277
294
|
current_items.append(line)
|
|
278
|
-
|
|
295
|
+
|
|
279
296
|
# Save last section
|
|
280
297
|
if current_section:
|
|
281
298
|
sections[current_section] = current_items
|
|
282
|
-
|
|
299
|
+
|
|
283
300
|
return sections
|
|
284
|
-
|
|
285
|
-
def _optimize_section(
|
|
301
|
+
|
|
302
|
+
def _optimize_section(
|
|
303
|
+
self, items: List[str], agent_id: str
|
|
304
|
+
) -> Tuple[List[str], Dict[str, int]]:
|
|
286
305
|
"""Optimize a single section by removing duplicates and consolidating.
|
|
287
|
-
|
|
306
|
+
|
|
288
307
|
Args:
|
|
289
308
|
items: List of section content lines
|
|
290
309
|
agent_id: Agent identifier for context
|
|
291
|
-
|
|
310
|
+
|
|
292
311
|
Returns:
|
|
293
312
|
Tuple of (optimized_items, stats)
|
|
294
313
|
"""
|
|
295
|
-
stats = {
|
|
296
|
-
|
|
297
|
-
"items_consolidated": 0,
|
|
298
|
-
"items_reordered": 0
|
|
299
|
-
}
|
|
300
|
-
|
|
314
|
+
stats = {"duplicates_removed": 0, "items_consolidated": 0, "items_reordered": 0}
|
|
315
|
+
|
|
301
316
|
# Separate header and bullet points
|
|
302
317
|
header_lines = []
|
|
303
318
|
bullet_points = []
|
|
304
319
|
other_lines = []
|
|
305
|
-
|
|
320
|
+
|
|
306
321
|
for line in items:
|
|
307
322
|
stripped = line.strip()
|
|
308
|
-
if stripped.startswith(
|
|
323
|
+
if stripped.startswith("- "):
|
|
309
324
|
bullet_points.append(line)
|
|
310
|
-
elif stripped.startswith(
|
|
325
|
+
elif stripped.startswith(("## ", "<!--")):
|
|
311
326
|
header_lines.append(line)
|
|
312
327
|
else:
|
|
313
328
|
other_lines.append(line)
|
|
314
|
-
|
|
329
|
+
|
|
315
330
|
if not bullet_points:
|
|
316
331
|
return items, stats
|
|
317
|
-
|
|
332
|
+
|
|
318
333
|
# Remove duplicates
|
|
319
334
|
deduplicated_points, duplicates_removed = self._remove_duplicates(bullet_points)
|
|
320
335
|
stats["duplicates_removed"] = duplicates_removed
|
|
321
|
-
|
|
336
|
+
|
|
322
337
|
# Consolidate similar items
|
|
323
|
-
consolidated_points, items_consolidated = self._consolidate_similar_items(
|
|
338
|
+
consolidated_points, items_consolidated = self._consolidate_similar_items(
|
|
339
|
+
deduplicated_points
|
|
340
|
+
)
|
|
324
341
|
stats["items_consolidated"] = items_consolidated
|
|
325
|
-
|
|
342
|
+
|
|
326
343
|
# Reorder by priority
|
|
327
344
|
reordered_points = self._reorder_by_priority(consolidated_points)
|
|
328
345
|
if reordered_points != consolidated_points:
|
|
329
346
|
stats["items_reordered"] = 1
|
|
330
|
-
|
|
347
|
+
|
|
331
348
|
# Rebuild section
|
|
332
349
|
optimized_items = header_lines + other_lines + reordered_points
|
|
333
|
-
|
|
350
|
+
|
|
334
351
|
return optimized_items, stats
|
|
335
|
-
|
|
352
|
+
|
|
336
353
|
def _remove_duplicates(self, bullet_points: List[str]) -> Tuple[List[str], int]:
|
|
337
354
|
"""Remove duplicate bullet points.
|
|
338
|
-
|
|
355
|
+
|
|
339
356
|
Args:
|
|
340
357
|
bullet_points: List of bullet point lines
|
|
341
|
-
|
|
358
|
+
|
|
342
359
|
Returns:
|
|
343
360
|
Tuple of (deduplicated_points, count_removed)
|
|
344
361
|
"""
|
|
345
362
|
seen_content = set()
|
|
346
363
|
unique_points = []
|
|
347
364
|
duplicates_removed = 0
|
|
348
|
-
|
|
365
|
+
|
|
349
366
|
for point in bullet_points:
|
|
350
367
|
# Normalize content for comparison
|
|
351
|
-
content = point.strip().lower().replace(
|
|
352
|
-
content_normalized = re.sub(r
|
|
353
|
-
|
|
368
|
+
content = point.strip().lower().replace("- ", "")
|
|
369
|
+
content_normalized = re.sub(r"\s+", " ", content).strip()
|
|
370
|
+
|
|
354
371
|
if content_normalized not in seen_content:
|
|
355
372
|
seen_content.add(content_normalized)
|
|
356
373
|
unique_points.append(point)
|
|
357
374
|
else:
|
|
358
375
|
duplicates_removed += 1
|
|
359
376
|
self.logger.debug(f"Removed duplicate: {point.strip()[:50]}...")
|
|
360
|
-
|
|
377
|
+
|
|
361
378
|
return unique_points, duplicates_removed
|
|
362
|
-
|
|
363
|
-
def _consolidate_similar_items(
|
|
379
|
+
|
|
380
|
+
def _consolidate_similar_items(
|
|
381
|
+
self, bullet_points: List[str]
|
|
382
|
+
) -> Tuple[List[str], int]:
|
|
364
383
|
"""Consolidate similar bullet points.
|
|
365
|
-
|
|
384
|
+
|
|
366
385
|
Args:
|
|
367
386
|
bullet_points: List of bullet point lines
|
|
368
|
-
|
|
387
|
+
|
|
369
388
|
Returns:
|
|
370
389
|
Tuple of (consolidated_points, count_consolidated)
|
|
371
390
|
"""
|
|
372
391
|
if len(bullet_points) < 2:
|
|
373
392
|
return bullet_points, 0
|
|
374
|
-
|
|
393
|
+
|
|
375
394
|
consolidated = []
|
|
376
395
|
items_consolidated = 0
|
|
377
396
|
used_indices = set()
|
|
378
|
-
|
|
397
|
+
|
|
379
398
|
for i, point_a in enumerate(bullet_points):
|
|
380
399
|
if i in used_indices:
|
|
381
400
|
continue
|
|
382
|
-
|
|
383
|
-
content_a = point_a.strip().replace(
|
|
401
|
+
|
|
402
|
+
content_a = point_a.strip().replace("- ", "")
|
|
384
403
|
similar_items = [point_a]
|
|
385
404
|
similar_indices = {i}
|
|
386
|
-
|
|
405
|
+
|
|
387
406
|
# Find similar items
|
|
388
|
-
for j, point_b in enumerate(bullet_points[i+1:], i+1):
|
|
407
|
+
for j, point_b in enumerate(bullet_points[i + 1 :], i + 1):
|
|
389
408
|
if j in used_indices:
|
|
390
409
|
continue
|
|
391
|
-
|
|
392
|
-
content_b = point_b.strip().replace(
|
|
393
|
-
similarity = SequenceMatcher(
|
|
394
|
-
|
|
410
|
+
|
|
411
|
+
content_b = point_b.strip().replace("- ", "")
|
|
412
|
+
similarity = SequenceMatcher(
|
|
413
|
+
None, content_a.lower(), content_b.lower()
|
|
414
|
+
).ratio()
|
|
415
|
+
|
|
395
416
|
if similarity >= self.CONSOLIDATION_THRESHOLD:
|
|
396
417
|
similar_items.append(point_b)
|
|
397
418
|
similar_indices.add(j)
|
|
398
|
-
|
|
419
|
+
|
|
399
420
|
# Consolidate if we found similar items
|
|
400
421
|
if len(similar_items) > 1:
|
|
401
422
|
consolidated_content = self._merge_similar_items(similar_items)
|
|
@@ -404,220 +425,228 @@ class MemoryOptimizer(LoggerMixin):
|
|
|
404
425
|
self.logger.debug(f"Consolidated {len(similar_items)} similar items")
|
|
405
426
|
else:
|
|
406
427
|
consolidated.append(point_a)
|
|
407
|
-
|
|
428
|
+
|
|
408
429
|
used_indices.update(similar_indices)
|
|
409
|
-
|
|
430
|
+
|
|
410
431
|
return consolidated, items_consolidated
|
|
411
|
-
|
|
432
|
+
|
|
412
433
|
def _merge_similar_items(self, similar_items: List[str]) -> str:
|
|
413
434
|
"""Merge similar items into a single consolidated item.
|
|
414
|
-
|
|
435
|
+
|
|
415
436
|
Args:
|
|
416
437
|
similar_items: List of similar bullet points
|
|
417
|
-
|
|
438
|
+
|
|
418
439
|
Returns:
|
|
419
440
|
Consolidated content string
|
|
420
441
|
"""
|
|
421
442
|
# Take the longest/most detailed item as base
|
|
422
|
-
contents = [item.strip().replace(
|
|
443
|
+
contents = [item.strip().replace("- ", "") for item in similar_items]
|
|
423
444
|
base_content = max(contents, key=len)
|
|
424
|
-
|
|
445
|
+
|
|
425
446
|
# Look for additional details in other items
|
|
426
447
|
all_words = set()
|
|
427
448
|
for content in contents:
|
|
428
449
|
all_words.update(content.lower().split())
|
|
429
|
-
|
|
450
|
+
|
|
430
451
|
base_words = set(base_content.lower().split())
|
|
431
452
|
additional_words = all_words - base_words
|
|
432
|
-
|
|
453
|
+
|
|
433
454
|
# If there are meaningful additional words, add them
|
|
434
455
|
if additional_words and len(additional_words) < 5: # Don't add too much
|
|
435
456
|
additional_text = " (" + ", ".join(sorted(additional_words)) + ")"
|
|
436
457
|
return base_content + additional_text
|
|
437
|
-
|
|
458
|
+
|
|
438
459
|
return base_content
|
|
439
|
-
|
|
460
|
+
|
|
440
461
|
def _reorder_by_priority(self, bullet_points: List[str]) -> List[str]:
|
|
441
462
|
"""Reorder bullet points by priority/importance.
|
|
442
|
-
|
|
463
|
+
|
|
443
464
|
Args:
|
|
444
465
|
bullet_points: List of bullet point lines
|
|
445
|
-
|
|
466
|
+
|
|
446
467
|
Returns:
|
|
447
468
|
Reordered list of bullet points
|
|
448
469
|
"""
|
|
470
|
+
|
|
449
471
|
def get_priority_score(point: str) -> int:
|
|
450
472
|
content = point.lower()
|
|
451
473
|
score = 0
|
|
452
|
-
|
|
474
|
+
|
|
453
475
|
# High priority keywords
|
|
454
|
-
for keyword in self.PRIORITY_KEYWORDS[
|
|
476
|
+
for keyword in self.PRIORITY_KEYWORDS["high"]:
|
|
455
477
|
if keyword in content:
|
|
456
478
|
score += 3
|
|
457
|
-
|
|
479
|
+
|
|
458
480
|
# Medium priority keywords
|
|
459
|
-
for keyword in self.PRIORITY_KEYWORDS[
|
|
481
|
+
for keyword in self.PRIORITY_KEYWORDS["medium"]:
|
|
460
482
|
if keyword in content:
|
|
461
483
|
score += 2
|
|
462
|
-
|
|
484
|
+
|
|
463
485
|
# Low priority keywords
|
|
464
|
-
for keyword in self.PRIORITY_KEYWORDS[
|
|
486
|
+
for keyword in self.PRIORITY_KEYWORDS["low"]:
|
|
465
487
|
if keyword in content:
|
|
466
488
|
score += 1
|
|
467
|
-
|
|
489
|
+
|
|
468
490
|
# Length-based priority (more detailed items are often more important)
|
|
469
491
|
if len(content) > 100:
|
|
470
492
|
score += 1
|
|
471
|
-
|
|
493
|
+
|
|
472
494
|
return score
|
|
473
|
-
|
|
495
|
+
|
|
474
496
|
# Sort by priority score (descending) then alphabetically
|
|
475
497
|
return sorted(bullet_points, key=lambda x: (-get_priority_score(x), x.lower()))
|
|
476
|
-
|
|
477
|
-
def _rebuild_memory_content(
|
|
498
|
+
|
|
499
|
+
def _rebuild_memory_content(
|
|
500
|
+
self, sections: Dict[str, List[str]], agent_id: str
|
|
501
|
+
) -> str:
|
|
478
502
|
"""Rebuild memory content from optimized sections.
|
|
479
|
-
|
|
503
|
+
|
|
480
504
|
Args:
|
|
481
505
|
sections: Dict of section names to content lines
|
|
482
506
|
agent_id: Agent identifier
|
|
483
|
-
|
|
507
|
+
|
|
484
508
|
Returns:
|
|
485
509
|
Rebuilt memory content string
|
|
486
510
|
"""
|
|
487
511
|
content_lines = []
|
|
488
|
-
|
|
512
|
+
|
|
489
513
|
# Add header if it exists
|
|
490
|
-
if
|
|
491
|
-
content_lines.extend(sections[
|
|
492
|
-
|
|
514
|
+
if "header" in sections:
|
|
515
|
+
content_lines.extend(sections["header"])
|
|
516
|
+
|
|
493
517
|
# Add sections in a logical order
|
|
494
518
|
section_order = [
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
519
|
+
"Project Architecture",
|
|
520
|
+
"Coding Patterns Learned",
|
|
521
|
+
"Implementation Guidelines",
|
|
522
|
+
"Domain-Specific Knowledge",
|
|
523
|
+
"Effective Strategies",
|
|
524
|
+
"Common Mistakes to Avoid",
|
|
525
|
+
"Integration Points",
|
|
526
|
+
"Performance Considerations",
|
|
527
|
+
"Current Technical Context",
|
|
528
|
+
"Recent Learnings",
|
|
505
529
|
]
|
|
506
|
-
|
|
530
|
+
|
|
507
531
|
# Add ordered sections
|
|
508
532
|
for section_name in section_order:
|
|
509
|
-
if section_name in sections and section_name !=
|
|
510
|
-
if content_lines and
|
|
511
|
-
content_lines.append(
|
|
533
|
+
if section_name in sections and section_name != "header":
|
|
534
|
+
if content_lines and content_lines[-1].strip() != "":
|
|
535
|
+
content_lines.append("") # Add spacing
|
|
512
536
|
content_lines.extend(sections[section_name])
|
|
513
|
-
|
|
537
|
+
|
|
514
538
|
# Add any remaining sections not in the order
|
|
515
539
|
for section_name, section_content in sections.items():
|
|
516
|
-
if section_name not in section_order and section_name !=
|
|
517
|
-
if content_lines and
|
|
518
|
-
content_lines.append(
|
|
540
|
+
if section_name not in section_order and section_name != "header":
|
|
541
|
+
if content_lines and content_lines[-1].strip() != "":
|
|
542
|
+
content_lines.append("")
|
|
519
543
|
content_lines.extend(section_content)
|
|
520
|
-
|
|
544
|
+
|
|
521
545
|
# Update timestamp
|
|
522
|
-
content =
|
|
523
|
-
timestamp = datetime.now().strftime(
|
|
524
|
-
|
|
525
|
-
r
|
|
526
|
-
f
|
|
527
|
-
content
|
|
546
|
+
content = "\n".join(content_lines)
|
|
547
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
|
|
548
|
+
return re.sub(
|
|
549
|
+
r"<!-- Last Updated: .+ \| Auto-updated by: .+ -->",
|
|
550
|
+
f"<!-- Last Updated: {timestamp} | Auto-updated by: optimizer -->",
|
|
551
|
+
content,
|
|
528
552
|
)
|
|
529
|
-
|
|
530
|
-
return content
|
|
531
|
-
|
|
553
|
+
|
|
532
554
|
def _create_backup(self, memory_file: Path) -> Path:
|
|
533
555
|
"""Create backup of memory file before optimization.
|
|
534
|
-
|
|
556
|
+
|
|
535
557
|
Args:
|
|
536
558
|
memory_file: Path to memory file
|
|
537
|
-
|
|
559
|
+
|
|
538
560
|
Returns:
|
|
539
561
|
Path to backup file
|
|
540
562
|
"""
|
|
541
|
-
timestamp = datetime.now().strftime(
|
|
563
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
542
564
|
backup_name = f"{memory_file.stem}_backup_{timestamp}{memory_file.suffix}"
|
|
543
565
|
backup_path = memory_file.parent / backup_name
|
|
544
|
-
|
|
545
|
-
backup_path.write_text(
|
|
566
|
+
|
|
567
|
+
backup_path.write_text(
|
|
568
|
+
memory_file.read_text(encoding="utf-8"), encoding="utf-8"
|
|
569
|
+
)
|
|
546
570
|
self.logger.debug(f"Created backup: {backup_path}")
|
|
547
|
-
|
|
571
|
+
|
|
548
572
|
return backup_path
|
|
549
|
-
|
|
573
|
+
|
|
550
574
|
def _analyze_single_agent(self, agent_id: str) -> Dict[str, Any]:
|
|
551
575
|
"""Analyze optimization opportunities for a single agent.
|
|
552
|
-
|
|
576
|
+
|
|
553
577
|
Args:
|
|
554
578
|
agent_id: Agent identifier
|
|
555
|
-
|
|
579
|
+
|
|
556
580
|
Returns:
|
|
557
581
|
Analysis results
|
|
558
582
|
"""
|
|
559
583
|
memory_file = self.memories_dir / f"{agent_id}_agent.md"
|
|
560
|
-
|
|
584
|
+
|
|
561
585
|
if not memory_file.exists():
|
|
562
586
|
return {
|
|
563
587
|
"success": False,
|
|
564
588
|
"agent_id": agent_id,
|
|
565
|
-
"error": "Memory file not found"
|
|
589
|
+
"error": "Memory file not found",
|
|
566
590
|
}
|
|
567
|
-
|
|
568
|
-
content = memory_file.read_text(encoding=
|
|
591
|
+
|
|
592
|
+
content = memory_file.read_text(encoding="utf-8")
|
|
569
593
|
sections = self._parse_memory_sections(content)
|
|
570
|
-
|
|
594
|
+
|
|
571
595
|
analysis = {
|
|
572
596
|
"success": True,
|
|
573
597
|
"agent_id": agent_id,
|
|
574
598
|
"file_size": len(content),
|
|
575
|
-
"sections": len(
|
|
576
|
-
|
|
599
|
+
"sections": len(
|
|
600
|
+
[s for s in sections if s.lower() not in ["header", "metadata"]]
|
|
601
|
+
),
|
|
602
|
+
"opportunities": [],
|
|
577
603
|
}
|
|
578
|
-
|
|
604
|
+
|
|
579
605
|
# Analyze each section for opportunities
|
|
580
606
|
for section_name, items in sections.items():
|
|
581
|
-
if section_name.lower() in [
|
|
607
|
+
if section_name.lower() in ["header", "metadata"]:
|
|
582
608
|
continue
|
|
583
|
-
|
|
584
|
-
bullet_points = [line for line in items if line.strip().startswith(
|
|
585
|
-
|
|
609
|
+
|
|
610
|
+
bullet_points = [line for line in items if line.strip().startswith("- ")]
|
|
611
|
+
|
|
586
612
|
if len(bullet_points) > 1:
|
|
587
613
|
# Check for duplicates
|
|
588
614
|
unique_points, duplicates = self._remove_duplicates(bullet_points)
|
|
589
615
|
if duplicates > 0:
|
|
590
|
-
analysis["opportunities"].append(
|
|
591
|
-
|
|
616
|
+
analysis["opportunities"].append(
|
|
617
|
+
f"{section_name}: {duplicates} duplicate items"
|
|
618
|
+
)
|
|
619
|
+
|
|
592
620
|
# Check for similar items
|
|
593
|
-
|
|
621
|
+
_consolidated, consolidated_count = self._consolidate_similar_items(
|
|
622
|
+
unique_points
|
|
623
|
+
)
|
|
594
624
|
if consolidated_count > 0:
|
|
595
|
-
analysis["opportunities"].append(
|
|
596
|
-
|
|
625
|
+
analysis["opportunities"].append(
|
|
626
|
+
f"{section_name}: {consolidated_count} items can be consolidated"
|
|
627
|
+
)
|
|
628
|
+
|
|
597
629
|
return analysis
|
|
598
|
-
|
|
630
|
+
|
|
599
631
|
def _analyze_all_agents(self) -> Dict[str, Any]:
|
|
600
632
|
"""Analyze optimization opportunities for all agents.
|
|
601
|
-
|
|
633
|
+
|
|
602
634
|
Returns:
|
|
603
635
|
Analysis results for all agents
|
|
604
636
|
"""
|
|
605
637
|
if not self.memories_dir.exists():
|
|
606
|
-
return {
|
|
607
|
-
|
|
608
|
-
"error": "Memory directory not found"
|
|
609
|
-
}
|
|
610
|
-
|
|
638
|
+
return {"success": False, "error": "Memory directory not found"}
|
|
639
|
+
|
|
611
640
|
memory_files = list(self.memories_dir.glob("*_agent.md"))
|
|
612
641
|
agents_analysis = {}
|
|
613
|
-
|
|
642
|
+
|
|
614
643
|
for memory_file in memory_files:
|
|
615
|
-
agent_id = memory_file.stem.replace(
|
|
644
|
+
agent_id = memory_file.stem.replace("_agent", "")
|
|
616
645
|
agents_analysis[agent_id] = self._analyze_single_agent(agent_id)
|
|
617
|
-
|
|
646
|
+
|
|
618
647
|
return {
|
|
619
648
|
"success": True,
|
|
620
|
-
"timestamp": datetime.now().isoformat(),
|
|
649
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
621
650
|
"agents_analyzed": len(agents_analysis),
|
|
622
|
-
"agents": agents_analysis
|
|
623
|
-
}
|
|
651
|
+
"agents": agents_analysis,
|
|
652
|
+
}
|