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
|
@@ -4,483 +4,585 @@ Memory command implementation for claude-mpm.
|
|
|
4
4
|
WHY: This module provides CLI commands for managing agent memory files,
|
|
5
5
|
allowing users to view, add, and manage persistent learnings across sessions.
|
|
6
6
|
|
|
7
|
-
DESIGN
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
DESIGN DECISIONS:
|
|
8
|
+
- Use MemoryCommand base class for consistent CLI patterns
|
|
9
|
+
- Leverage shared utilities for argument parsing and output formatting
|
|
10
|
+
- Maintain backward compatibility with existing functionality
|
|
11
|
+
- Support multiple output formats (json, yaml, table, text)
|
|
10
12
|
"""
|
|
11
13
|
|
|
12
14
|
import json
|
|
13
15
|
import os
|
|
14
|
-
from datetime import datetime
|
|
15
16
|
from pathlib import Path
|
|
17
|
+
from typing import Any, Dict
|
|
18
|
+
|
|
19
|
+
from ...core.enums import OutputFormat
|
|
20
|
+
from ...core.shared.config_loader import ConfigLoader
|
|
21
|
+
from ...services.agents.memory import AgentMemoryManager
|
|
22
|
+
from ...services.cli.memory_crud_service import MemoryCRUDService
|
|
23
|
+
from ...services.cli.memory_output_formatter import MemoryOutputFormatter
|
|
24
|
+
from ..shared.base_command import CommandResult, MemoryCommand
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _is_structured_output(args) -> bool:
|
|
28
|
+
"""Check if args specify structured output format (JSON/YAML)."""
|
|
29
|
+
if hasattr(args, "format"):
|
|
30
|
+
fmt = str(args.format).lower()
|
|
31
|
+
return fmt in (OutputFormat.JSON, OutputFormat.YAML)
|
|
32
|
+
return False
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class MemoryManagementCommand(MemoryCommand):
|
|
36
|
+
"""Memory management command using shared utilities."""
|
|
37
|
+
|
|
38
|
+
def __init__(self):
|
|
39
|
+
super().__init__("memory")
|
|
40
|
+
self._memory_manager = None
|
|
41
|
+
self._formatter = None
|
|
42
|
+
self._crud_service = None
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def memory_manager(self):
|
|
46
|
+
"""Get memory manager instance (lazy loaded)."""
|
|
47
|
+
if self._memory_manager is None:
|
|
48
|
+
config_loader = ConfigLoader()
|
|
49
|
+
config = config_loader.load_main_config()
|
|
50
|
+
# Use CLAUDE_MPM_USER_PWD if available, otherwise use current working directory
|
|
51
|
+
user_pwd = os.environ.get("CLAUDE_MPM_USER_PWD", Path.cwd())
|
|
52
|
+
current_dir = Path(user_pwd)
|
|
53
|
+
self._memory_manager = AgentMemoryManager(config, current_dir)
|
|
54
|
+
return self._memory_manager
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def formatter(self):
|
|
58
|
+
"""Get formatter instance (lazy loaded)."""
|
|
59
|
+
if self._formatter is None:
|
|
60
|
+
# Check if quiet mode is requested
|
|
61
|
+
quiet = os.environ.get("CLAUDE_MPM_QUIET", "false").lower() == "true"
|
|
62
|
+
self._formatter = MemoryOutputFormatter(quiet=quiet)
|
|
63
|
+
return self._formatter
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def crud_service(self):
|
|
67
|
+
"""Get CRUD service instance (lazy loaded)."""
|
|
68
|
+
if self._crud_service is None:
|
|
69
|
+
self._crud_service = MemoryCRUDService(memory_manager=self.memory_manager)
|
|
70
|
+
return self._crud_service
|
|
71
|
+
|
|
72
|
+
def _get_output_format(self, args) -> str:
|
|
73
|
+
"""
|
|
74
|
+
Get output format from args with enum default.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
args: Command arguments
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
Output format string (compatible with both enum and string usage)
|
|
81
|
+
"""
|
|
82
|
+
return getattr(args, "format", OutputFormat.TEXT)
|
|
83
|
+
|
|
84
|
+
def _is_structured_format(self, format_str: str) -> bool:
|
|
85
|
+
"""
|
|
86
|
+
Check if format is structured (JSON/YAML).
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
format_str: Format string to check
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
True if format is JSON or YAML
|
|
93
|
+
"""
|
|
94
|
+
fmt = str(format_str).lower()
|
|
95
|
+
return fmt in (OutputFormat.JSON, OutputFormat.YAML)
|
|
96
|
+
|
|
97
|
+
def validate_args(self, args) -> str:
|
|
98
|
+
"""Validate command arguments."""
|
|
99
|
+
# Check if memory command is valid
|
|
100
|
+
if hasattr(args, "memory_command") and args.memory_command:
|
|
101
|
+
valid_commands = [
|
|
102
|
+
"init",
|
|
103
|
+
"view",
|
|
104
|
+
"add",
|
|
105
|
+
"clean",
|
|
106
|
+
"optimize",
|
|
107
|
+
"build",
|
|
108
|
+
"cross-ref",
|
|
109
|
+
"route",
|
|
110
|
+
]
|
|
111
|
+
if args.memory_command not in valid_commands:
|
|
112
|
+
return f"Unknown memory command: {args.memory_command}. Valid commands: {', '.join(valid_commands)}"
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
def run(self, args) -> CommandResult:
|
|
116
|
+
"""Execute the memory command."""
|
|
117
|
+
try:
|
|
118
|
+
# Handle default case (no subcommand)
|
|
119
|
+
if not hasattr(args, "memory_command") or not args.memory_command:
|
|
120
|
+
return self._show_status(args)
|
|
121
|
+
|
|
122
|
+
# Route to specific subcommand handlers
|
|
123
|
+
command_map = {
|
|
124
|
+
"init": self._init_memory,
|
|
125
|
+
"status": self._show_status,
|
|
126
|
+
"view": self._show_memories,
|
|
127
|
+
"add": self._add_learning,
|
|
128
|
+
"clean": self._clean_memory,
|
|
129
|
+
"optimize": self._optimize_memory,
|
|
130
|
+
"build": self._build_memory,
|
|
131
|
+
"cross-ref": self._cross_reference_memory,
|
|
132
|
+
"show": self._show_memories,
|
|
133
|
+
"route": self._route_memory_command,
|
|
134
|
+
}
|
|
16
135
|
|
|
17
|
-
|
|
136
|
+
if args.memory_command in command_map:
|
|
137
|
+
return command_map[args.memory_command](args)
|
|
138
|
+
available_commands = list(command_map.keys())
|
|
139
|
+
error_msg = f"Unknown memory command: {args.memory_command}"
|
|
18
140
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
141
|
+
output_format = self._get_output_format(args)
|
|
142
|
+
if self._is_structured_format(output_format):
|
|
143
|
+
return CommandResult.error_result(
|
|
144
|
+
error_msg, data={"available_commands": available_commands}
|
|
145
|
+
)
|
|
146
|
+
print(f"❌ {error_msg}")
|
|
147
|
+
print(f"Available commands: {', '.join(available_commands)}")
|
|
148
|
+
return CommandResult.error_result(error_msg)
|
|
22
149
|
|
|
150
|
+
except Exception as e:
|
|
151
|
+
self.logger.error(f"Error managing memory: {e}", exc_info=True)
|
|
152
|
+
return CommandResult.error_result(f"Error managing memory: {e}")
|
|
23
153
|
|
|
24
|
-
def
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# Load configuration for memory manager
|
|
41
|
-
config = Config()
|
|
42
|
-
# Use CLAUDE_MPM_USER_PWD if available (when called via shell script),
|
|
43
|
-
# otherwise use current working directory
|
|
44
|
-
user_pwd = os.environ.get('CLAUDE_MPM_USER_PWD', os.getcwd())
|
|
45
|
-
current_dir = Path(user_pwd)
|
|
46
|
-
memory_manager = AgentMemoryManager(config, current_dir)
|
|
47
|
-
|
|
48
|
-
if not args.memory_command:
|
|
49
|
-
# No subcommand - show status
|
|
50
|
-
_show_status(memory_manager)
|
|
51
|
-
return
|
|
52
|
-
|
|
53
|
-
if args.memory_command == "status":
|
|
54
|
-
_show_status(memory_manager)
|
|
55
|
-
|
|
56
|
-
elif args.memory_command == "view":
|
|
57
|
-
_show_memories(args, memory_manager)
|
|
58
|
-
|
|
59
|
-
elif args.memory_command == "add":
|
|
60
|
-
_add_learning(args, memory_manager)
|
|
61
|
-
|
|
62
|
-
elif args.memory_command == "clean":
|
|
63
|
-
_clean_memory(args, memory_manager)
|
|
64
|
-
|
|
65
|
-
elif args.memory_command == "optimize":
|
|
66
|
-
_optimize_memory(args, memory_manager)
|
|
67
|
-
|
|
68
|
-
elif args.memory_command == "build":
|
|
69
|
-
_build_memory(args, memory_manager)
|
|
70
|
-
|
|
71
|
-
elif args.memory_command == "cross-ref":
|
|
72
|
-
_cross_reference_memory(args, memory_manager)
|
|
73
|
-
|
|
74
|
-
elif args.memory_command == "route":
|
|
75
|
-
_route_memory_command(args, memory_manager)
|
|
76
|
-
|
|
77
|
-
elif args.memory_command == "show":
|
|
78
|
-
_show_memories(args, memory_manager)
|
|
79
|
-
|
|
80
|
-
elif args.memory_command == "init":
|
|
81
|
-
_init_memory(args, memory_manager)
|
|
82
|
-
|
|
83
|
-
else:
|
|
84
|
-
logger.error(f"Unknown memory command: {args.memory_command}")
|
|
85
|
-
print(f"Unknown memory command: {args.memory_command}")
|
|
86
|
-
print("Available commands: init, status, view, add, clean, optimize, build, cross-ref, route, show")
|
|
87
|
-
return 1
|
|
88
|
-
|
|
89
|
-
except Exception as e:
|
|
90
|
-
logger.error(f"Error managing memory: {e}")
|
|
91
|
-
print(f"❌ Error: {e}")
|
|
92
|
-
return 1
|
|
93
|
-
|
|
94
|
-
return 0
|
|
154
|
+
def _show_status(self, args) -> CommandResult:
|
|
155
|
+
"""Show memory system status."""
|
|
156
|
+
try:
|
|
157
|
+
output_format = self._get_output_format(args)
|
|
158
|
+
|
|
159
|
+
if self._is_structured_format(output_format):
|
|
160
|
+
# Structured output
|
|
161
|
+
status_data = self._get_status_data()
|
|
162
|
+
return CommandResult.success_result(
|
|
163
|
+
"Memory status retrieved", data=status_data
|
|
164
|
+
)
|
|
165
|
+
# Text output using formatter
|
|
166
|
+
status = self.memory_manager.get_memory_status()
|
|
167
|
+
output = self.formatter.format_status(status)
|
|
168
|
+
print(output)
|
|
169
|
+
return CommandResult.success_result("Memory status displayed")
|
|
95
170
|
|
|
171
|
+
except Exception as e:
|
|
172
|
+
self.logger.error(f"Error showing memory status: {e}", exc_info=True)
|
|
173
|
+
return CommandResult.error_result(f"Error showing memory status: {e}")
|
|
174
|
+
|
|
175
|
+
def _get_status_data(self) -> Dict[str, Any]:
|
|
176
|
+
"""Get memory status as structured data."""
|
|
177
|
+
# Use CRUD service to list memories with stats
|
|
178
|
+
result = self.crud_service.list_memories(include_stats=True)
|
|
179
|
+
|
|
180
|
+
if not result.get("success"):
|
|
181
|
+
return {
|
|
182
|
+
"error": result.get("error", "Failed to get status"),
|
|
183
|
+
"exists": False,
|
|
184
|
+
"agents": [],
|
|
185
|
+
"total_size_kb": 0,
|
|
186
|
+
"total_files": 0,
|
|
187
|
+
}
|
|
96
188
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
print("📝 Note: Copy the task above to execute the memory initialization process.")
|
|
159
|
-
print(" Use 'claude-mpm memory add' commands to add discovered insights.")
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
def _show_status(memory_manager):
|
|
163
|
-
"""
|
|
164
|
-
Show comprehensive memory system status.
|
|
165
|
-
|
|
166
|
-
WHY: Users need to see memory system health, file sizes, optimization
|
|
167
|
-
opportunities, and agent-specific statistics to understand the system state.
|
|
168
|
-
|
|
169
|
-
Args:
|
|
170
|
-
memory_manager: AgentMemoryManager instance
|
|
171
|
-
"""
|
|
172
|
-
print("Agent Memory System Status")
|
|
173
|
-
print("-" * 80)
|
|
174
|
-
|
|
175
|
-
try:
|
|
176
|
-
# Get comprehensive status from memory manager
|
|
177
|
-
status = memory_manager.get_memory_status()
|
|
178
|
-
|
|
179
|
-
if not status.get("success", True):
|
|
180
|
-
print(f"❌ Error getting status: {status.get('error', 'Unknown error')}")
|
|
181
|
-
return
|
|
182
|
-
|
|
183
|
-
# Show system overview
|
|
184
|
-
system_health = status.get("system_health", "unknown")
|
|
185
|
-
health_emoji = {
|
|
186
|
-
"healthy": "✅",
|
|
187
|
-
"needs_optimization": "⚠️",
|
|
188
|
-
"high_usage": "📊",
|
|
189
|
-
"no_memory_dir": "📁"
|
|
190
|
-
}.get(system_health, "❓")
|
|
191
|
-
|
|
192
|
-
print(f"🧠 Memory System Health: {health_emoji} {system_health}")
|
|
193
|
-
print(f"📁 Memory Directory: {status.get('memory_directory', 'Unknown')}")
|
|
194
|
-
print(f"🔧 System Enabled: {'Yes' if status.get('system_enabled', True) else 'No'}")
|
|
195
|
-
print(f"📚 Auto Learning: {'Yes' if status.get('auto_learning', True) else 'No'}")
|
|
196
|
-
print(f"📊 Total Agents: {status.get('total_agents', 0)}")
|
|
197
|
-
print(f"💾 Total Size: {status.get('total_size_kb', 0):.1f} KB")
|
|
198
|
-
print()
|
|
199
|
-
|
|
200
|
-
# Show optimization opportunities
|
|
201
|
-
opportunities = status.get("optimization_opportunities", [])
|
|
202
|
-
if opportunities:
|
|
203
|
-
print(f"⚠️ Optimization Opportunities ({len(opportunities)}):")
|
|
204
|
-
for opportunity in opportunities[:5]: # Show top 5
|
|
205
|
-
print(f" • {opportunity}")
|
|
206
|
-
if len(opportunities) > 5:
|
|
207
|
-
print(f" ... and {len(opportunities) - 5} more")
|
|
208
|
-
print()
|
|
209
|
-
|
|
210
|
-
# Show per-agent details
|
|
211
|
-
agents = status.get("agents", {})
|
|
212
|
-
if agents:
|
|
213
|
-
print(f"📋 Agent Memory Details:")
|
|
214
|
-
for agent_id, agent_info in sorted(agents.items()):
|
|
215
|
-
if "error" in agent_info:
|
|
216
|
-
print(f" ❌ {agent_id}: Error - {agent_info['error']}")
|
|
217
|
-
continue
|
|
218
|
-
|
|
219
|
-
size_kb = agent_info.get("size_kb", 0)
|
|
220
|
-
size_limit = agent_info.get("size_limit_kb", 8)
|
|
221
|
-
utilization = agent_info.get("size_utilization", 0)
|
|
222
|
-
sections = agent_info.get("sections", 0)
|
|
223
|
-
items = agent_info.get("items", 0)
|
|
224
|
-
last_modified = agent_info.get("last_modified", "Unknown")
|
|
225
|
-
auto_learning = agent_info.get("auto_learning", True)
|
|
226
|
-
|
|
227
|
-
# Format last modified time
|
|
228
|
-
try:
|
|
229
|
-
from datetime import datetime
|
|
230
|
-
dt = datetime.fromisoformat(last_modified.replace('Z', '+00:00'))
|
|
231
|
-
last_modified_str = dt.strftime('%Y-%m-%d %H:%M:%S')
|
|
232
|
-
except:
|
|
233
|
-
last_modified_str = last_modified
|
|
234
|
-
|
|
235
|
-
# Status indicator based on usage
|
|
236
|
-
if utilization > 90:
|
|
237
|
-
status_emoji = "🔴" # High usage
|
|
238
|
-
elif utilization > 70:
|
|
239
|
-
status_emoji = "🟡" # Medium usage
|
|
189
|
+
# Transform CRUD service result to expected format
|
|
190
|
+
memories = result.get("memories", [])
|
|
191
|
+
agents = [
|
|
192
|
+
{
|
|
193
|
+
"agent_id": mem["agent_id"],
|
|
194
|
+
"file": mem["file"],
|
|
195
|
+
"size_kb": mem.get("size_kb", 0),
|
|
196
|
+
"path": mem["path"],
|
|
197
|
+
}
|
|
198
|
+
for mem in memories
|
|
199
|
+
]
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
"memory_directory": result.get("memory_directory", ""),
|
|
203
|
+
"exists": result.get("exists", False),
|
|
204
|
+
"agents": agents,
|
|
205
|
+
"total_size_kb": result.get("total_size_kb", 0),
|
|
206
|
+
"total_files": result.get("total_files", 0),
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
def _show_memories(self, args) -> CommandResult:
|
|
210
|
+
"""Show agent memories."""
|
|
211
|
+
try:
|
|
212
|
+
output_format = self._get_output_format(args)
|
|
213
|
+
agent_id = getattr(args, "agent_id", None)
|
|
214
|
+
raw_output = getattr(args, "raw", False)
|
|
215
|
+
|
|
216
|
+
if output_format in ["json", "yaml"] or raw_output:
|
|
217
|
+
# Use CRUD service for structured output
|
|
218
|
+
result = self.crud_service.read_memory(agent_id)
|
|
219
|
+
|
|
220
|
+
if not result.get("success"):
|
|
221
|
+
return CommandResult.error_result(
|
|
222
|
+
result.get("error", "Failed to read memories")
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
if raw_output:
|
|
226
|
+
# Output raw JSON for external tools
|
|
227
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
228
|
+
return CommandResult.success_result("Raw memory data output")
|
|
229
|
+
|
|
230
|
+
return CommandResult.success_result("Memories retrieved", data=result)
|
|
231
|
+
|
|
232
|
+
# Text output
|
|
233
|
+
result = self.crud_service.read_memory(agent_id)
|
|
234
|
+
|
|
235
|
+
if not result.get("success"):
|
|
236
|
+
print(f"❌ {result.get('error', 'Failed to read memories')}")
|
|
237
|
+
return CommandResult.error_result(result.get("error"))
|
|
238
|
+
|
|
239
|
+
print("🧠 Agent Memories Display")
|
|
240
|
+
print("-" * 80)
|
|
241
|
+
|
|
242
|
+
if agent_id:
|
|
243
|
+
# Single agent memory
|
|
244
|
+
content = result.get("content", "")
|
|
245
|
+
if content:
|
|
246
|
+
output = self.formatter.format_memory_view(
|
|
247
|
+
agent_id, content, getattr(args, "format", "detailed")
|
|
248
|
+
)
|
|
249
|
+
print(output)
|
|
240
250
|
else:
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
memory_dir = memory_manager.memories_dir
|
|
262
|
-
if not memory_dir.exists():
|
|
263
|
-
print("📁 Memory directory not found - no agent memories stored yet")
|
|
264
|
-
print(f" Expected location: {memory_dir}")
|
|
265
|
-
return
|
|
266
|
-
|
|
267
|
-
memory_files = list(memory_dir.glob("*_agent.md"))
|
|
268
|
-
|
|
269
|
-
if not memory_files:
|
|
270
|
-
print("📭 No memory files found")
|
|
271
|
-
print(f" Memory directory: {memory_dir}")
|
|
272
|
-
return
|
|
273
|
-
|
|
274
|
-
print(f"📁 Memory directory: {memory_dir}")
|
|
275
|
-
print(f"📊 Total memory files: {len(memory_files)}")
|
|
276
|
-
|
|
277
|
-
total_size = 0
|
|
278
|
-
for file_path in sorted(memory_files):
|
|
279
|
-
stat = file_path.stat()
|
|
280
|
-
size_kb = stat.st_size / 1024
|
|
281
|
-
total_size += stat.st_size
|
|
282
|
-
|
|
283
|
-
agent_id = file_path.stem.replace('_agent', '')
|
|
284
|
-
print(f" {agent_id}: {size_kb:.1f} KB")
|
|
285
|
-
|
|
286
|
-
print(f"💾 Total size: {total_size / 1024:.1f} KB")
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
def _view_memory(args, memory_manager):
|
|
290
|
-
"""
|
|
291
|
-
View agent memory file contents.
|
|
292
|
-
|
|
293
|
-
WHY: Users need to inspect what learnings an agent has accumulated
|
|
294
|
-
to understand its behavior and debug issues.
|
|
295
|
-
|
|
296
|
-
Args:
|
|
297
|
-
args: Command arguments with agent_id
|
|
298
|
-
memory_manager: AgentMemoryManager instance
|
|
299
|
-
"""
|
|
300
|
-
agent_id = args.agent_id
|
|
301
|
-
|
|
302
|
-
try:
|
|
303
|
-
memory_content = memory_manager.load_agent_memory(agent_id)
|
|
304
|
-
|
|
305
|
-
if not memory_content:
|
|
306
|
-
print(f"📭 No memory found for agent: {agent_id}")
|
|
307
|
-
return
|
|
308
|
-
|
|
309
|
-
print(f"🧠 Memory for agent: {agent_id}")
|
|
310
|
-
print("-" * 80)
|
|
311
|
-
print(memory_content)
|
|
312
|
-
|
|
313
|
-
except FileNotFoundError:
|
|
314
|
-
print(f"📭 No memory file found for agent: {agent_id}")
|
|
315
|
-
except Exception as e:
|
|
316
|
-
print(f"❌ Error viewing memory: {e}")
|
|
251
|
+
print(f"📭 No memory found for agent: {agent_id}")
|
|
252
|
+
else:
|
|
253
|
+
# All agent memories
|
|
254
|
+
agents = result.get("agents", {})
|
|
255
|
+
if agents:
|
|
256
|
+
# Parse and format all memories
|
|
257
|
+
agent_memories = {}
|
|
258
|
+
for aid, data in agents.items():
|
|
259
|
+
sections = self.formatter._parse_memory_content(
|
|
260
|
+
data.get("content", "")
|
|
261
|
+
)
|
|
262
|
+
agent_memories[aid] = sections
|
|
263
|
+
|
|
264
|
+
output = self.formatter.format_agent_memories_summary(
|
|
265
|
+
agent_memories, getattr(args, "format", "detailed")
|
|
266
|
+
)
|
|
267
|
+
print(output)
|
|
268
|
+
else:
|
|
269
|
+
print("📭 No agent memories found")
|
|
317
270
|
|
|
271
|
+
return CommandResult.success_result("Memories displayed")
|
|
318
272
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
WHY: Allows manual injection of learnings for testing or correction
|
|
324
|
-
purposes, useful for debugging and development.
|
|
325
|
-
|
|
326
|
-
Args:
|
|
327
|
-
args: Command arguments with agent_id, learning_type, and content
|
|
328
|
-
memory_manager: AgentMemoryManager instance
|
|
329
|
-
"""
|
|
330
|
-
agent_id = args.agent_id
|
|
331
|
-
section = args.learning_type # Map learning_type to section name
|
|
332
|
-
content = args.content
|
|
333
|
-
|
|
334
|
-
# Map learning types to appropriate sections
|
|
335
|
-
section_map = {
|
|
336
|
-
"pattern": "Project Architecture",
|
|
337
|
-
"error": "Common Mistakes to Avoid",
|
|
338
|
-
"optimization": "Implementation Guidelines",
|
|
339
|
-
"preference": "Implementation Guidelines",
|
|
340
|
-
"context": "Current Technical Context"
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
section_name = section_map.get(section, "Current Technical Context")
|
|
344
|
-
|
|
345
|
-
try:
|
|
346
|
-
success = memory_manager.update_agent_memory(agent_id, section_name, content)
|
|
347
|
-
|
|
348
|
-
if success:
|
|
349
|
-
print(f"✅ Added {section} to {agent_id} memory in section: {section_name}")
|
|
350
|
-
print(f" Content: {content[:100]}{'...' if len(content) > 100 else ''}")
|
|
351
|
-
else:
|
|
352
|
-
print(f"❌ Failed to add learning to {agent_id} memory")
|
|
353
|
-
print(" Memory file may be at size limit or section may be full")
|
|
354
|
-
|
|
355
|
-
except Exception as e:
|
|
356
|
-
print(f"❌ Error adding learning: {e}")
|
|
273
|
+
except Exception as e:
|
|
274
|
+
self.logger.error(f"Error showing memories: {e}", exc_info=True)
|
|
275
|
+
return CommandResult.error_result(f"Error showing memories: {e}")
|
|
357
276
|
|
|
277
|
+
# Removed _get_memories_data - now handled inline with CRUD service
|
|
358
278
|
|
|
359
|
-
def
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
279
|
+
def _init_memory(self, args) -> CommandResult:
|
|
280
|
+
"""Initialize project-specific memories."""
|
|
281
|
+
try:
|
|
282
|
+
output_format = self._get_output_format(args)
|
|
283
|
+
|
|
284
|
+
# Use CRUD service for initialization task
|
|
285
|
+
result = self.crud_service.init_project_memories()
|
|
286
|
+
|
|
287
|
+
if not result.get("success"):
|
|
288
|
+
return CommandResult.error_result(
|
|
289
|
+
result.get("error", "Failed to create initialization task")
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
if self._is_structured_format(output_format):
|
|
293
|
+
# Return structured task data
|
|
294
|
+
return CommandResult.success_result(
|
|
295
|
+
"Memory initialization task created", data=result.get("task_data")
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
# Text output - display the task
|
|
299
|
+
task = result.get("task_data", {})
|
|
300
|
+
print("🚀 Initializing project-specific memories...")
|
|
301
|
+
print("=" * 80)
|
|
302
|
+
print()
|
|
303
|
+
print("This will analyze the project to:")
|
|
304
|
+
for idx, instruction in enumerate(task.get("instructions", []), 1):
|
|
305
|
+
print(f" {idx}. {instruction}")
|
|
306
|
+
print()
|
|
307
|
+
print("The analysis will cover:")
|
|
308
|
+
for area in task.get("focus_areas", []):
|
|
309
|
+
print(f" • {area}")
|
|
310
|
+
print()
|
|
311
|
+
print("Example commands to use:")
|
|
312
|
+
for cmd in task.get("example_commands", []):
|
|
313
|
+
print(f" {cmd}")
|
|
314
|
+
print()
|
|
315
|
+
print("=" * 80)
|
|
316
|
+
print()
|
|
317
|
+
print(
|
|
318
|
+
"📝 Note: Copy the task above to execute the memory initialization process."
|
|
319
|
+
)
|
|
394
320
|
|
|
321
|
+
return CommandResult.success_result("Memory initialization task displayed")
|
|
395
322
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
result =
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
323
|
+
except Exception as e:
|
|
324
|
+
self.logger.error(f"Error initializing memory: {e}", exc_info=True)
|
|
325
|
+
return CommandResult.error_result(f"Error initializing memory: {e}")
|
|
326
|
+
|
|
327
|
+
def _add_learning(self, args) -> CommandResult:
|
|
328
|
+
"""Add learning to agent memory."""
|
|
329
|
+
try:
|
|
330
|
+
output_format = self._get_output_format(args)
|
|
331
|
+
|
|
332
|
+
# Extract arguments
|
|
333
|
+
agent_id = getattr(args, "agent_id", None)
|
|
334
|
+
learning_type = getattr(args, "learning_type", "context")
|
|
335
|
+
content = getattr(args, "content", "")
|
|
336
|
+
|
|
337
|
+
if not agent_id or not content:
|
|
338
|
+
return CommandResult.error_result(
|
|
339
|
+
"Agent ID and content are required for adding learning"
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
# Use CRUD service to add learning
|
|
343
|
+
result = self.crud_service.update_memory(agent_id, learning_type, content)
|
|
344
|
+
|
|
345
|
+
if not result.get("success"):
|
|
346
|
+
return CommandResult.error_result(
|
|
347
|
+
result.get("error", "Failed to add learning")
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
if self._is_structured_format(output_format):
|
|
351
|
+
# Return structured result
|
|
352
|
+
return CommandResult.success_result(
|
|
353
|
+
"Learning added to agent memory", data=result
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# Text output
|
|
357
|
+
print(f"✅ Added {learning_type} to {agent_id} memory")
|
|
358
|
+
print(f" Section: {result.get('section', 'Unknown')}")
|
|
359
|
+
print(f" Content: {result.get('content_preview', content[:100])}")
|
|
360
|
+
|
|
361
|
+
return CommandResult.success_result("Learning added")
|
|
362
|
+
|
|
363
|
+
except Exception as e:
|
|
364
|
+
self.logger.error(f"Error adding learning: {e}", exc_info=True)
|
|
365
|
+
return CommandResult.error_result(f"Error adding learning: {e}")
|
|
366
|
+
|
|
367
|
+
def _clean_memory(self, args) -> CommandResult:
|
|
368
|
+
"""Clean up old/unused memory files."""
|
|
369
|
+
try:
|
|
370
|
+
output_format = self._get_output_format(args)
|
|
371
|
+
agent_id = getattr(args, "agent_id", None)
|
|
372
|
+
dry_run = getattr(args, "dry_run", True)
|
|
373
|
+
|
|
374
|
+
# Use CRUD service for cleanup
|
|
375
|
+
result = self.crud_service.clean_memory(agent_id=agent_id, dry_run=dry_run)
|
|
376
|
+
|
|
377
|
+
if not result.get("success"):
|
|
378
|
+
return CommandResult.error_result(result.get("error", "Cleanup failed"))
|
|
379
|
+
|
|
380
|
+
if self._is_structured_format(output_format):
|
|
381
|
+
# Return structured cleanup results
|
|
382
|
+
return CommandResult.success_result(
|
|
383
|
+
result.get("message", "Memory cleanup completed"), data=result
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
# Text output
|
|
387
|
+
print("🧹 Memory cleanup")
|
|
388
|
+
print("-" * 80)
|
|
389
|
+
|
|
390
|
+
if dry_run:
|
|
391
|
+
print("📊 Cleanup preview (dry run)")
|
|
392
|
+
candidates = result.get("cleanup_candidates", [])
|
|
393
|
+
if candidates:
|
|
394
|
+
print(f"Found {len(candidates)} files eligible for cleanup:")
|
|
395
|
+
for candidate in candidates:
|
|
396
|
+
print(
|
|
397
|
+
f" • {candidate['agent_id']}: {candidate['size_kb']:.1f} KB, {candidate['age_days']} days old"
|
|
398
|
+
)
|
|
399
|
+
print(f" Reason: {candidate['reason']}")
|
|
400
|
+
else:
|
|
401
|
+
print("No files eligible for cleanup")
|
|
402
|
+
else:
|
|
403
|
+
cleaned = result.get("cleaned_files", [])
|
|
404
|
+
if cleaned:
|
|
405
|
+
print(f"Cleaned {len(cleaned)} files")
|
|
406
|
+
else:
|
|
407
|
+
print(result.get("message", "No files cleaned"))
|
|
408
|
+
|
|
409
|
+
if result.get("note"):
|
|
410
|
+
print(f"\n⚠️ {result['note']}")
|
|
411
|
+
|
|
412
|
+
return CommandResult.success_result("Memory cleanup completed")
|
|
413
|
+
|
|
414
|
+
except Exception as e:
|
|
415
|
+
self.logger.error(f"Error cleaning memory: {e}", exc_info=True)
|
|
416
|
+
return CommandResult.error_result(f"Error cleaning memory: {e}")
|
|
417
|
+
|
|
418
|
+
def _optimize_memory(self, args) -> CommandResult:
|
|
419
|
+
"""Optimize memory files."""
|
|
420
|
+
try:
|
|
421
|
+
output_format = self._get_output_format(args)
|
|
422
|
+
agent_id = getattr(args, "agent_id", None)
|
|
423
|
+
|
|
424
|
+
if self._is_structured_format(output_format):
|
|
425
|
+
# For structured output, perform optimization and return results
|
|
426
|
+
if agent_id:
|
|
427
|
+
result = self.memory_manager.optimize_memory(agent_id)
|
|
428
|
+
else:
|
|
429
|
+
result = self.memory_manager.optimize_memory()
|
|
430
|
+
return CommandResult.success_result(
|
|
431
|
+
"Memory optimization completed", data=result
|
|
432
|
+
)
|
|
433
|
+
# Text output using formatter
|
|
422
434
|
if agent_id:
|
|
423
|
-
|
|
424
|
-
|
|
435
|
+
print(f"📊 Optimizing memory for agent: {agent_id}")
|
|
436
|
+
result = self.memory_manager.optimize_memory(agent_id)
|
|
437
|
+
output = self.formatter.format_optimization_results(
|
|
438
|
+
result, is_single_agent=True
|
|
439
|
+
)
|
|
425
440
|
else:
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
441
|
+
print("📊 Optimizing all agent memories...")
|
|
442
|
+
result = self.memory_manager.optimize_memory()
|
|
443
|
+
output = self.formatter.format_optimization_results(
|
|
444
|
+
result, is_single_agent=False
|
|
445
|
+
)
|
|
446
|
+
print(output)
|
|
447
|
+
return CommandResult.success_result("Memory optimization completed")
|
|
448
|
+
|
|
449
|
+
except Exception as e:
|
|
450
|
+
self.logger.error(f"Error optimizing memory: {e}", exc_info=True)
|
|
451
|
+
return CommandResult.error_result(f"Error optimizing memory: {e}")
|
|
452
|
+
|
|
453
|
+
def _build_memory(self, args) -> CommandResult:
|
|
454
|
+
"""Build agent memories from project documentation."""
|
|
455
|
+
try:
|
|
456
|
+
output_format = self._get_output_format(args)
|
|
457
|
+
|
|
458
|
+
if self._is_structured_format(output_format):
|
|
459
|
+
# For structured output, return build results
|
|
460
|
+
build_data = {
|
|
461
|
+
"built_memories": [],
|
|
462
|
+
"processed_files": [],
|
|
463
|
+
"summary": "Memory build completed",
|
|
464
|
+
}
|
|
465
|
+
return CommandResult.success_result(
|
|
466
|
+
"Memory build completed", data=build_data
|
|
467
|
+
)
|
|
468
|
+
# Text output using existing function
|
|
469
|
+
_build_memory(args, self.memory_manager)
|
|
470
|
+
return CommandResult.success_result("Memory build completed")
|
|
471
|
+
|
|
472
|
+
except Exception as e:
|
|
473
|
+
self.logger.error(f"Error building memory: {e}", exc_info=True)
|
|
474
|
+
return CommandResult.error_result(f"Error building memory: {e}")
|
|
475
|
+
|
|
476
|
+
def _cross_reference_memory(self, args) -> CommandResult:
|
|
477
|
+
"""Find cross-references and common patterns."""
|
|
478
|
+
try:
|
|
479
|
+
output_format = self._get_output_format(args)
|
|
480
|
+
|
|
481
|
+
if self._is_structured_format(output_format):
|
|
482
|
+
# For structured output, return cross-reference results
|
|
483
|
+
crossref_data = {
|
|
484
|
+
"common_patterns": [],
|
|
485
|
+
"agent_similarities": [],
|
|
486
|
+
"summary": "Cross-reference analysis completed",
|
|
487
|
+
}
|
|
488
|
+
return CommandResult.success_result(
|
|
489
|
+
"Cross-reference analysis completed", data=crossref_data
|
|
490
|
+
)
|
|
491
|
+
# Text output using existing function
|
|
492
|
+
_cross_reference_memory(args, self.memory_manager)
|
|
493
|
+
return CommandResult.success_result("Cross-reference analysis completed")
|
|
494
|
+
|
|
495
|
+
except Exception as e:
|
|
496
|
+
self.logger.error(f"Error cross-referencing memory: {e}", exc_info=True)
|
|
497
|
+
return CommandResult.error_result(f"Error cross-referencing memory: {e}")
|
|
498
|
+
|
|
499
|
+
def _route_memory_command(self, args) -> CommandResult:
|
|
500
|
+
"""Route memory command to appropriate agent."""
|
|
501
|
+
try:
|
|
502
|
+
output_format = self._get_output_format(args)
|
|
503
|
+
|
|
504
|
+
if self._is_structured_format(output_format):
|
|
505
|
+
# For structured output, return routing results
|
|
506
|
+
routing_data = {
|
|
507
|
+
"routed_to": "memory_agent",
|
|
508
|
+
"command": getattr(args, "command", ""),
|
|
509
|
+
"summary": "Command routed successfully",
|
|
510
|
+
}
|
|
511
|
+
return CommandResult.success_result(
|
|
512
|
+
"Command routed successfully", data=routing_data
|
|
513
|
+
)
|
|
514
|
+
# Text output using existing function
|
|
515
|
+
_route_memory_command(args, self.memory_manager)
|
|
516
|
+
return CommandResult.success_result("Command routed successfully")
|
|
517
|
+
|
|
518
|
+
except Exception as e:
|
|
519
|
+
self.logger.error(f"Error routing memory command: {e}", exc_info=True)
|
|
520
|
+
return CommandResult.error_result(f"Error routing memory command: {e}")
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
def manage_memory(args) -> int:
|
|
524
|
+
"""Main entry point for memory management commands.
|
|
525
|
+
|
|
526
|
+
This function maintains backward compatibility while using the new BaseCommand pattern.
|
|
527
|
+
"""
|
|
528
|
+
command = MemoryManagementCommand()
|
|
529
|
+
result = command.execute(args)
|
|
530
|
+
|
|
531
|
+
# Print result if structured output format is requested
|
|
532
|
+
if _is_structured_output(args):
|
|
533
|
+
command.print_result(result, args)
|
|
534
|
+
|
|
535
|
+
return result.exit_code
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
# Removed _init_memory - now handled by MemoryCRUDService.init_project_memories()
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
# Removed _show_status - functionality moved to MemoryManagementCommand._show_status()
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
# Removed _show_basic_status - functionality integrated into MemoryManagementCommand
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
# Removed _view_memory - functionality moved to MemoryCRUDService.read_memory()
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
# Removed _add_learning - now handled by MemoryCRUDService.update_memory()
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
# Removed _clean_memory - now handled by MemoryCRUDService.clean_memory()
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
# Removed _optimize_memory - functionality moved to MemoryManagementCommand._optimize_memory()
|
|
433
557
|
|
|
434
558
|
|
|
435
559
|
def _build_memory(args, memory_manager):
|
|
436
560
|
"""
|
|
437
561
|
Build agent memories from project documentation.
|
|
438
|
-
|
|
562
|
+
|
|
439
563
|
WHY: Project documentation contains valuable patterns and guidelines that
|
|
440
564
|
agents should be aware of. This command automatically extracts and assigns
|
|
441
565
|
relevant information to appropriate agents.
|
|
442
|
-
|
|
566
|
+
|
|
443
567
|
Args:
|
|
444
568
|
args: Command arguments with optional force_rebuild flag
|
|
445
569
|
memory_manager: AgentMemoryManager instance
|
|
446
570
|
"""
|
|
447
571
|
print("📚 Memory Building from Documentation")
|
|
448
572
|
print("-" * 80)
|
|
449
|
-
|
|
450
|
-
force_rebuild = getattr(args,
|
|
451
|
-
|
|
573
|
+
|
|
574
|
+
force_rebuild = getattr(args, "force_rebuild", False)
|
|
575
|
+
|
|
452
576
|
try:
|
|
453
577
|
print("🔍 Analyzing project documentation...")
|
|
454
578
|
result = memory_manager.build_memories_from_docs(force_rebuild)
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
if result.get('agents_affected'):
|
|
464
|
-
print(f" Affected agents: {', '.join(result['agents_affected'])}")
|
|
465
|
-
|
|
466
|
-
# Show file-specific results
|
|
467
|
-
files_results = result.get('files', {})
|
|
468
|
-
if files_results:
|
|
469
|
-
print("\n📄 File processing details:")
|
|
470
|
-
for file_path, file_result in files_results.items():
|
|
471
|
-
if file_result.get('success'):
|
|
472
|
-
extracted = file_result.get('items_extracted', 0)
|
|
473
|
-
created = file_result.get('memories_created', 0)
|
|
474
|
-
print(f" {file_path}: {extracted} items extracted, {created} memories created")
|
|
475
|
-
|
|
476
|
-
if result.get('errors'):
|
|
477
|
-
print("\n⚠️ Errors encountered:")
|
|
478
|
-
for error in result['errors']:
|
|
479
|
-
print(f" {error}")
|
|
480
|
-
|
|
481
|
-
else:
|
|
482
|
-
print(f"❌ Build failed: {result.get('error', 'Unknown error')}")
|
|
483
|
-
|
|
579
|
+
|
|
580
|
+
# Use formatter to display build results
|
|
581
|
+
quiet = os.environ.get("CLAUDE_MPM_QUIET", "false").lower() == "true"
|
|
582
|
+
formatter = MemoryOutputFormatter(quiet=quiet)
|
|
583
|
+
output = formatter.format_build_results(result)
|
|
584
|
+
print(output)
|
|
585
|
+
|
|
484
586
|
except Exception as e:
|
|
485
587
|
print(f"❌ Error building memories: {e}")
|
|
486
588
|
|
|
@@ -488,473 +590,110 @@ def _build_memory(args, memory_manager):
|
|
|
488
590
|
def _cross_reference_memory(args, memory_manager):
|
|
489
591
|
"""
|
|
490
592
|
Find cross-references and common patterns across agent memories.
|
|
491
|
-
|
|
593
|
+
|
|
492
594
|
WHY: Different agents may have learned similar information or there may be
|
|
493
595
|
knowledge gaps that can be identified through cross-referencing.
|
|
494
|
-
|
|
596
|
+
|
|
495
597
|
Args:
|
|
496
598
|
args: Command arguments with optional query
|
|
497
599
|
memory_manager: AgentMemoryManager instance
|
|
498
600
|
"""
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
query = getattr(args, 'query', None)
|
|
503
|
-
|
|
601
|
+
query = getattr(args, "query", None)
|
|
602
|
+
|
|
504
603
|
try:
|
|
505
|
-
if query:
|
|
506
|
-
print(f"🔍 Searching for: '{query}'")
|
|
507
|
-
else:
|
|
508
|
-
print("🔍 Analyzing all agent memories for patterns...")
|
|
509
|
-
|
|
510
604
|
result = memory_manager.cross_reference_memories(query)
|
|
511
|
-
|
|
512
|
-
if result.get("success") is False:
|
|
513
|
-
print(f"❌ Analysis failed: {result.get('error', 'Unknown error')}")
|
|
514
|
-
return
|
|
515
|
-
|
|
516
|
-
# Display common patterns
|
|
517
|
-
common_patterns = result.get("common_patterns", [])
|
|
518
|
-
if common_patterns:
|
|
519
|
-
print(f"\n🔄 Common patterns found ({len(common_patterns)}):")
|
|
520
|
-
for pattern in common_patterns[:10]: # Show top 10
|
|
521
|
-
agents = ', '.join(pattern['agents'])
|
|
522
|
-
print(f" • {pattern['pattern']}")
|
|
523
|
-
print(f" Found in: {agents} ({pattern['count']} instances)")
|
|
524
|
-
else:
|
|
525
|
-
print("\n🔄 No common patterns found")
|
|
526
|
-
|
|
527
|
-
# Display query matches if query was provided
|
|
528
|
-
if query and result.get("query_matches"):
|
|
529
|
-
print(f"\n🎯 Query matches for '{query}':")
|
|
530
|
-
for match in result["query_matches"]:
|
|
531
|
-
print(f" 📋 {match['agent']}:")
|
|
532
|
-
for line in match['matches'][:3]: # Show first 3 matches
|
|
533
|
-
print(f" • {line}")
|
|
534
|
-
|
|
535
|
-
# Display agent correlations
|
|
536
|
-
correlations = result.get("agent_correlations", {})
|
|
537
|
-
if correlations:
|
|
538
|
-
print(f"\n🤝 Agent knowledge correlations:")
|
|
539
|
-
sorted_correlations = sorted(correlations.items(), key=lambda x: x[1], reverse=True)
|
|
540
|
-
for agents, count in sorted_correlations[:5]: # Show top 5
|
|
541
|
-
print(f" {agents}: {count} common items")
|
|
542
|
-
else:
|
|
543
|
-
print("\n🤝 No significant correlations found")
|
|
544
|
-
|
|
545
|
-
except Exception as e:
|
|
546
|
-
print(f"❌ Error during cross-reference analysis: {e}")
|
|
547
605
|
|
|
606
|
+
# Use formatter to display cross-reference results
|
|
607
|
+
quiet = os.environ.get("CLAUDE_MPM_QUIET", "false").lower() == "true"
|
|
608
|
+
formatter = MemoryOutputFormatter(quiet=quiet)
|
|
609
|
+
output = formatter.format_cross_reference(result, query)
|
|
610
|
+
print(output)
|
|
548
611
|
|
|
549
|
-
def _show_memories(args, memory_manager):
|
|
550
|
-
"""
|
|
551
|
-
Show agent memories in a user-friendly format with cross-references and patterns.
|
|
552
|
-
|
|
553
|
-
WHY: Users need to see agent memories in a readable format to understand
|
|
554
|
-
what agents have learned and identify common patterns across agents.
|
|
555
|
-
|
|
556
|
-
DESIGN DECISION: Added --raw flag to output structured JSON data for
|
|
557
|
-
programmatic processing, enabling external tools and scripts to access
|
|
558
|
-
all agent memories in a structured format.
|
|
559
|
-
|
|
560
|
-
Args:
|
|
561
|
-
args: Command arguments with optional agent_id, format, and raw flag
|
|
562
|
-
memory_manager: AgentMemoryManager instance
|
|
563
|
-
"""
|
|
564
|
-
agent_id = getattr(args, 'agent_id', None)
|
|
565
|
-
format_type = getattr(args, 'format', 'detailed')
|
|
566
|
-
raw_output = getattr(args, 'raw', False)
|
|
567
|
-
|
|
568
|
-
try:
|
|
569
|
-
if raw_output:
|
|
570
|
-
# Output structured JSON data
|
|
571
|
-
if agent_id:
|
|
572
|
-
# Get single agent memory in raw format
|
|
573
|
-
_output_single_agent_raw(agent_id, memory_manager)
|
|
574
|
-
else:
|
|
575
|
-
# Get all agent memories in raw format
|
|
576
|
-
_output_all_memories_raw(memory_manager)
|
|
577
|
-
else:
|
|
578
|
-
# Normal user-friendly display
|
|
579
|
-
print("🧠 Agent Memories Display")
|
|
580
|
-
print("-" * 80)
|
|
581
|
-
|
|
582
|
-
if agent_id:
|
|
583
|
-
_show_single_agent_memory(agent_id, format_type, memory_manager)
|
|
584
|
-
else:
|
|
585
|
-
_show_all_agent_memories(format_type, memory_manager)
|
|
586
|
-
|
|
587
612
|
except Exception as e:
|
|
588
|
-
|
|
589
|
-
# Output error in JSON format for consistency
|
|
590
|
-
error_output = {
|
|
591
|
-
"success": False,
|
|
592
|
-
"error": str(e),
|
|
593
|
-
"timestamp": datetime.now().isoformat()
|
|
594
|
-
}
|
|
595
|
-
print(json.dumps(error_output, indent=2))
|
|
596
|
-
else:
|
|
597
|
-
print(f"❌ Error showing memories: {e}")
|
|
613
|
+
print(f"❌ Error during cross-reference analysis: {e}")
|
|
598
614
|
|
|
599
615
|
|
|
600
|
-
|
|
601
|
-
"""Show memory for a single agent in the specified format."""
|
|
602
|
-
memory_content = memory_manager.load_agent_memory(agent_id)
|
|
603
|
-
|
|
604
|
-
if not memory_content:
|
|
605
|
-
print(f"📭 No memory found for agent: {agent_id}")
|
|
606
|
-
return
|
|
607
|
-
|
|
608
|
-
print(f"🤖 Agent: {agent_id}")
|
|
609
|
-
print("-" * 40)
|
|
610
|
-
|
|
611
|
-
if format_type == 'full':
|
|
612
|
-
print(memory_content)
|
|
613
|
-
else:
|
|
614
|
-
# Parse and display memory sections
|
|
615
|
-
sections = _parse_memory_content(memory_content)
|
|
616
|
-
|
|
617
|
-
for section_name, items in sections.items():
|
|
618
|
-
if items:
|
|
619
|
-
print(f"\n📚 {section_name} ({len(items)} items):")
|
|
620
|
-
for i, item in enumerate(items[:5], 1): # Show first 5 items
|
|
621
|
-
print(f" {i}. {item}")
|
|
622
|
-
if len(items) > 5:
|
|
623
|
-
print(f" ... and {len(items) - 5} more")
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
def _show_all_agent_memories(format_type, memory_manager):
|
|
627
|
-
"""Show memories for all agents with cross-references."""
|
|
628
|
-
# Get all available agent memory files
|
|
629
|
-
memory_dir = memory_manager.memories_dir
|
|
630
|
-
if not memory_dir.exists():
|
|
631
|
-
print("📁 No memory directory found")
|
|
632
|
-
return
|
|
633
|
-
|
|
634
|
-
memory_files = list(memory_dir.glob("*_agent.md"))
|
|
635
|
-
if not memory_files:
|
|
636
|
-
print("📭 No agent memories found")
|
|
637
|
-
return
|
|
638
|
-
|
|
639
|
-
print(f"📊 Found memories for {len(memory_files)} agents")
|
|
640
|
-
print()
|
|
641
|
-
|
|
642
|
-
agent_memories = {}
|
|
643
|
-
total_items = 0
|
|
644
|
-
|
|
645
|
-
# Load all agent memories
|
|
646
|
-
for file_path in sorted(memory_files):
|
|
647
|
-
agent_id = file_path.stem.replace('_agent', '')
|
|
648
|
-
try:
|
|
649
|
-
memory_content = memory_manager.load_agent_memory(agent_id)
|
|
650
|
-
if memory_content:
|
|
651
|
-
sections = _parse_memory_content(memory_content)
|
|
652
|
-
agent_memories[agent_id] = sections
|
|
653
|
-
|
|
654
|
-
# Count items
|
|
655
|
-
item_count = sum(len(items) for items in sections.values())
|
|
656
|
-
total_items += item_count
|
|
657
|
-
|
|
658
|
-
if format_type == 'summary':
|
|
659
|
-
print(f"🤖 {agent_id}")
|
|
660
|
-
print(f" 📚 {len(sections)} sections, {item_count} total items")
|
|
661
|
-
|
|
662
|
-
# Show section summary
|
|
663
|
-
for section_name, items in sections.items():
|
|
664
|
-
if items:
|
|
665
|
-
print(f" • {section_name}: {len(items)} items")
|
|
666
|
-
print()
|
|
667
|
-
elif format_type == 'detailed':
|
|
668
|
-
print(f"🤖 {agent_id}")
|
|
669
|
-
print(f" 📚 {len(sections)} sections, {item_count} total items")
|
|
670
|
-
|
|
671
|
-
for section_name, items in sections.items():
|
|
672
|
-
if items:
|
|
673
|
-
print(f"\n 📖 {section_name}:")
|
|
674
|
-
for item in items[:3]: # Show first 3 items
|
|
675
|
-
print(f" • {item}")
|
|
676
|
-
if len(items) > 3:
|
|
677
|
-
print(f" ... and {len(items) - 3} more")
|
|
678
|
-
print()
|
|
679
|
-
except Exception as e:
|
|
680
|
-
print(f"❌ Error loading memory for {agent_id}: {e}")
|
|
681
|
-
|
|
682
|
-
print(f"📊 Total: {total_items} memory items across {len(agent_memories)} agents")
|
|
683
|
-
|
|
684
|
-
# Show cross-references if we have multiple agents
|
|
685
|
-
if len(agent_memories) > 1:
|
|
686
|
-
print("\n🔗 Cross-References and Common Patterns:")
|
|
687
|
-
_find_common_patterns(agent_memories)
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
def _parse_memory_content(content):
|
|
691
|
-
"""Parse memory content into sections and items."""
|
|
692
|
-
sections = {}
|
|
693
|
-
current_section = None
|
|
694
|
-
current_items = []
|
|
695
|
-
|
|
696
|
-
for line in content.split('\n'):
|
|
697
|
-
line = line.strip()
|
|
698
|
-
|
|
699
|
-
if line.startswith('## ') and not line.startswith('## Memory Usage'):
|
|
700
|
-
# New section
|
|
701
|
-
if current_section and current_items:
|
|
702
|
-
sections[current_section] = current_items.copy()
|
|
703
|
-
|
|
704
|
-
current_section = line[3:].strip()
|
|
705
|
-
current_items = []
|
|
706
|
-
elif line.startswith('- ') and current_section:
|
|
707
|
-
# Item in current section
|
|
708
|
-
item = line[2:].strip()
|
|
709
|
-
if item and len(item) > 5: # Filter out very short items
|
|
710
|
-
current_items.append(item)
|
|
711
|
-
|
|
712
|
-
# Add final section
|
|
713
|
-
if current_section and current_items:
|
|
714
|
-
sections[current_section] = current_items
|
|
715
|
-
|
|
716
|
-
return sections
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
def _find_common_patterns(agent_memories):
|
|
720
|
-
"""Find common patterns across agent memories."""
|
|
721
|
-
pattern_count = {}
|
|
722
|
-
agent_patterns = {}
|
|
723
|
-
|
|
724
|
-
# Collect all patterns and which agents have them
|
|
725
|
-
for agent_id, sections in agent_memories.items():
|
|
726
|
-
agent_patterns[agent_id] = set()
|
|
727
|
-
|
|
728
|
-
for section_name, items in sections.items():
|
|
729
|
-
for item in items:
|
|
730
|
-
# Normalize item for comparison (lowercase, basic cleanup)
|
|
731
|
-
normalized = item.lower().strip()
|
|
732
|
-
if len(normalized) > 10: # Skip very short items
|
|
733
|
-
pattern_count[normalized] = pattern_count.get(normalized, 0) + 1
|
|
734
|
-
agent_patterns[agent_id].add(normalized)
|
|
735
|
-
|
|
736
|
-
# Find patterns that appear in multiple agents
|
|
737
|
-
common_patterns = [(pattern, count) for pattern, count in pattern_count.items() if count > 1]
|
|
738
|
-
common_patterns.sort(key=lambda x: x[1], reverse=True)
|
|
739
|
-
|
|
740
|
-
if common_patterns:
|
|
741
|
-
print("\n🔄 Most Common Patterns:")
|
|
742
|
-
for pattern, count in common_patterns[:5]:
|
|
743
|
-
# Find which agents have this pattern
|
|
744
|
-
agents_with_pattern = [agent for agent, patterns in agent_patterns.items()
|
|
745
|
-
if pattern in patterns]
|
|
746
|
-
print(f" • {pattern[:80]}{'...' if len(pattern) > 80 else ''}")
|
|
747
|
-
print(f" Found in: {', '.join(agents_with_pattern)} ({count} agents)")
|
|
748
|
-
print()
|
|
749
|
-
else:
|
|
750
|
-
print(" No common patterns found across agents")
|
|
751
|
-
|
|
752
|
-
# Show agent similarities
|
|
753
|
-
print("\n🤝 Agent Knowledge Similarity:")
|
|
754
|
-
agents = list(agent_memories.keys())
|
|
755
|
-
for i, agent1 in enumerate(agents):
|
|
756
|
-
for agent2 in agents[i+1:]:
|
|
757
|
-
common_items = len(agent_patterns[agent1] & agent_patterns[agent2])
|
|
758
|
-
if common_items > 0:
|
|
759
|
-
total_items = len(agent_patterns[agent1] | agent_patterns[agent2])
|
|
760
|
-
similarity = (common_items / total_items) * 100 if total_items > 0 else 0
|
|
761
|
-
print(f" {agent1} ↔ {agent2}: {common_items} common items ({similarity:.1f}% similarity)")
|
|
616
|
+
# Note: Memory display functions have been moved to MemoryManagementCommand and MemoryCRUDService
|
|
762
617
|
|
|
763
618
|
|
|
764
619
|
def _route_memory_command(args, memory_manager):
|
|
765
620
|
"""
|
|
766
621
|
Test memory command routing logic.
|
|
767
|
-
|
|
622
|
+
|
|
768
623
|
WHY: Users and developers need to understand how memory commands are routed
|
|
769
624
|
to appropriate agents for debugging and customization purposes.
|
|
770
|
-
|
|
625
|
+
|
|
771
626
|
Args:
|
|
772
627
|
args: Command arguments with content to route
|
|
773
628
|
memory_manager: AgentMemoryManager instance
|
|
774
629
|
"""
|
|
775
630
|
print("🎯 Memory Command Routing Test")
|
|
776
631
|
print("-" * 80)
|
|
777
|
-
|
|
778
|
-
content = getattr(args,
|
|
632
|
+
|
|
633
|
+
content = getattr(args, "content", None)
|
|
779
634
|
if not content:
|
|
780
635
|
print("❌ No content provided for routing analysis")
|
|
781
636
|
print(" Usage: memory route --content 'your content here'")
|
|
782
637
|
return
|
|
783
|
-
|
|
638
|
+
|
|
784
639
|
try:
|
|
785
|
-
print(
|
|
786
|
-
|
|
640
|
+
print(
|
|
641
|
+
f"📝 Analyzing content: '{content[:100]}{'...' if len(content) > 100 else ''}'"
|
|
642
|
+
)
|
|
643
|
+
|
|
787
644
|
result = memory_manager.route_memory_command(content)
|
|
788
|
-
|
|
645
|
+
|
|
789
646
|
if result.get("success") is False:
|
|
790
647
|
print(f"❌ Routing failed: {result.get('error', 'Unknown error')}")
|
|
791
648
|
return
|
|
792
|
-
|
|
649
|
+
|
|
793
650
|
target_agent = result.get("target_agent", "unknown")
|
|
794
651
|
section = result.get("section", "unknown")
|
|
795
652
|
confidence = result.get("confidence", 0.0)
|
|
796
653
|
reasoning = result.get("reasoning", "No reasoning provided")
|
|
797
|
-
|
|
798
|
-
print(
|
|
654
|
+
|
|
655
|
+
print("\n🎯 Routing Decision:")
|
|
799
656
|
print(f" Target Agent: {target_agent}")
|
|
800
657
|
print(f" Section: {section}")
|
|
801
658
|
print(f" Confidence: {confidence:.2f}")
|
|
802
659
|
print(f" Reasoning: {reasoning}")
|
|
803
|
-
|
|
660
|
+
|
|
804
661
|
# Show agent scores if available
|
|
805
662
|
agent_scores = result.get("agent_scores", {})
|
|
806
663
|
if agent_scores:
|
|
807
|
-
print(
|
|
664
|
+
print("\n📊 Agent Relevance Scores:")
|
|
808
665
|
sorted_scores = sorted(
|
|
809
|
-
[(agent, data[
|
|
810
|
-
key=lambda x: x[1],
|
|
666
|
+
[(agent, data["score"]) for agent, data in agent_scores.items()],
|
|
667
|
+
key=lambda x: x[1],
|
|
668
|
+
reverse=True,
|
|
811
669
|
)
|
|
812
670
|
for agent, score in sorted_scores[:5]: # Show top 5
|
|
813
671
|
print(f" {agent}: {score:.3f}")
|
|
814
672
|
# Show matched keywords if available
|
|
815
|
-
if agent in agent_scores and agent_scores[agent].get(
|
|
816
|
-
|
|
673
|
+
if agent in agent_scores and agent_scores[agent].get(
|
|
674
|
+
"matched_keywords"
|
|
675
|
+
):
|
|
676
|
+
keywords = ", ".join(agent_scores[agent]["matched_keywords"][:3])
|
|
817
677
|
print(f" Keywords: {keywords}")
|
|
818
|
-
|
|
678
|
+
|
|
819
679
|
except Exception as e:
|
|
820
680
|
print(f"❌ Error routing memory command: {e}")
|
|
821
681
|
|
|
822
682
|
|
|
823
683
|
def _display_single_optimization_result(result):
|
|
824
684
|
"""Display optimization results for a single agent."""
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
size_reduction_percent = result.get("size_reduction_percent", 0)
|
|
830
|
-
|
|
831
|
-
print(f"✅ Optimization completed for {agent_id}")
|
|
832
|
-
print(f" Original size: {original_size:,} bytes")
|
|
833
|
-
print(f" Optimized size: {optimized_size:,} bytes")
|
|
834
|
-
print(f" Size reduction: {size_reduction:,} bytes ({size_reduction_percent}%)")
|
|
835
|
-
|
|
836
|
-
duplicates = result.get("duplicates_removed", 0)
|
|
837
|
-
consolidated = result.get("items_consolidated", 0)
|
|
838
|
-
reordered = result.get("items_reordered", 0)
|
|
839
|
-
|
|
840
|
-
if duplicates > 0:
|
|
841
|
-
print(f" Duplicates removed: {duplicates}")
|
|
842
|
-
if consolidated > 0:
|
|
843
|
-
print(f" Items consolidated: {consolidated}")
|
|
844
|
-
if reordered > 0:
|
|
845
|
-
print(f" Sections reordered: {reordered}")
|
|
846
|
-
|
|
847
|
-
backup_path = result.get("backup_created")
|
|
848
|
-
if backup_path:
|
|
849
|
-
print(f" Backup created: {backup_path}")
|
|
685
|
+
quiet = os.environ.get("CLAUDE_MPM_QUIET", "false").lower() == "true"
|
|
686
|
+
formatter = MemoryOutputFormatter(quiet=quiet)
|
|
687
|
+
output = formatter.format_optimization_results(result, is_single_agent=True)
|
|
688
|
+
print(output)
|
|
850
689
|
|
|
851
690
|
|
|
852
691
|
def _display_bulk_optimization_results(result):
|
|
853
692
|
"""Display optimization results for all agents."""
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
print(
|
|
858
|
-
print(f" Agents optimized: {summary.get('agents_optimized', 0)}")
|
|
859
|
-
print(f" Total size before: {summary.get('total_size_before', 0):,} bytes")
|
|
860
|
-
print(f" Total size after: {summary.get('total_size_after', 0):,} bytes")
|
|
861
|
-
print(f" Total reduction: {summary.get('total_size_reduction', 0):,} bytes ({summary.get('total_size_reduction_percent', 0)}%)")
|
|
862
|
-
print(f" Total duplicates removed: {summary.get('total_duplicates_removed', 0)}")
|
|
863
|
-
print(f" Total items consolidated: {summary.get('total_items_consolidated', 0)}")
|
|
864
|
-
|
|
865
|
-
# Show per-agent summary
|
|
866
|
-
agents_results = result.get("agents", {})
|
|
867
|
-
if agents_results:
|
|
868
|
-
print(f"\n📊 Per-agent results:")
|
|
869
|
-
for agent_id, agent_result in agents_results.items():
|
|
870
|
-
if agent_result.get("success"):
|
|
871
|
-
reduction = agent_result.get("size_reduction_percent", 0)
|
|
872
|
-
duplicates = agent_result.get("duplicates_removed", 0)
|
|
873
|
-
consolidated = agent_result.get("items_consolidated", 0)
|
|
874
|
-
|
|
875
|
-
status_parts = []
|
|
876
|
-
if duplicates > 0:
|
|
877
|
-
status_parts.append(f"{duplicates} dupes")
|
|
878
|
-
if consolidated > 0:
|
|
879
|
-
status_parts.append(f"{consolidated} consolidated")
|
|
880
|
-
|
|
881
|
-
status = f" ({', '.join(status_parts)})" if status_parts else ""
|
|
882
|
-
print(f" {agent_id}: {reduction}% reduction{status}")
|
|
883
|
-
else:
|
|
884
|
-
error = agent_result.get("error", "Unknown error")
|
|
885
|
-
print(f" {agent_id}: ❌ {error}")
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
def _output_all_memories_raw(memory_manager):
|
|
889
|
-
"""
|
|
890
|
-
Output all agent memories in raw JSON format.
|
|
891
|
-
|
|
892
|
-
WHY: Provides programmatic access to all agent memories for external tools,
|
|
893
|
-
scripts, or APIs that need to process or analyze the complete memory state.
|
|
894
|
-
|
|
895
|
-
Args:
|
|
896
|
-
memory_manager: AgentMemoryManager instance
|
|
897
|
-
"""
|
|
898
|
-
try:
|
|
899
|
-
raw_data = memory_manager.get_all_memories_raw()
|
|
900
|
-
print(json.dumps(raw_data, indent=2, ensure_ascii=False))
|
|
901
|
-
except Exception as e:
|
|
902
|
-
error_output = {
|
|
903
|
-
"success": False,
|
|
904
|
-
"error": f"Failed to retrieve all memories: {str(e)}",
|
|
905
|
-
"timestamp": datetime.now().isoformat()
|
|
906
|
-
}
|
|
907
|
-
print(json.dumps(error_output, indent=2))
|
|
693
|
+
quiet = os.environ.get("CLAUDE_MPM_QUIET", "false").lower() == "true"
|
|
694
|
+
formatter = MemoryOutputFormatter(quiet=quiet)
|
|
695
|
+
output = formatter.format_optimization_results(result, is_single_agent=False)
|
|
696
|
+
print(output)
|
|
908
697
|
|
|
909
698
|
|
|
910
|
-
|
|
911
|
-
"""
|
|
912
|
-
Output single agent memory in raw JSON format.
|
|
913
|
-
|
|
914
|
-
WHY: Provides programmatic access to a specific agent's memory for
|
|
915
|
-
targeted analysis or processing by external tools.
|
|
916
|
-
|
|
917
|
-
Args:
|
|
918
|
-
agent_id: ID of the agent to retrieve memory for
|
|
919
|
-
memory_manager: AgentMemoryManager instance
|
|
920
|
-
"""
|
|
921
|
-
try:
|
|
922
|
-
# Get all memories and extract the specific agent
|
|
923
|
-
all_memories = memory_manager.get_all_memories_raw()
|
|
924
|
-
|
|
925
|
-
if not all_memories.get("success", False):
|
|
926
|
-
error_output = {
|
|
927
|
-
"success": False,
|
|
928
|
-
"error": all_memories.get("error", "Failed to retrieve memories"),
|
|
929
|
-
"timestamp": datetime.now().isoformat()
|
|
930
|
-
}
|
|
931
|
-
print(json.dumps(error_output, indent=2))
|
|
932
|
-
return
|
|
933
|
-
|
|
934
|
-
agents = all_memories.get("agents", {})
|
|
935
|
-
if agent_id not in agents:
|
|
936
|
-
error_output = {
|
|
937
|
-
"success": False,
|
|
938
|
-
"error": f"No memory found for agent: {agent_id}",
|
|
939
|
-
"available_agents": list(agents.keys()),
|
|
940
|
-
"timestamp": datetime.now().isoformat()
|
|
941
|
-
}
|
|
942
|
-
print(json.dumps(error_output, indent=2))
|
|
943
|
-
return
|
|
944
|
-
|
|
945
|
-
# Return single agent data with metadata
|
|
946
|
-
single_agent_output = {
|
|
947
|
-
"success": True,
|
|
948
|
-
"timestamp": all_memories["timestamp"],
|
|
949
|
-
"agent": agents[agent_id]
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
print(json.dumps(single_agent_output, indent=2, ensure_ascii=False))
|
|
953
|
-
|
|
954
|
-
except Exception as e:
|
|
955
|
-
error_output = {
|
|
956
|
-
"success": False,
|
|
957
|
-
"error": f"Failed to retrieve memory for agent {agent_id}: {str(e)}",
|
|
958
|
-
"timestamp": datetime.now().isoformat()
|
|
959
|
-
}
|
|
960
|
-
print(json.dumps(error_output, indent=2))
|
|
699
|
+
# Note: Raw output functions have been moved to MemoryCRUDService
|