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
|
@@ -19,42 +19,41 @@ This is a consolidated version combining all functionality from the previous
|
|
|
19
19
|
multi-file implementation for better maintainability.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
-
import os
|
|
23
|
-
import json
|
|
24
|
-
import logging
|
|
25
22
|
import asyncio
|
|
26
|
-
import
|
|
23
|
+
import json
|
|
27
24
|
from dataclasses import dataclass, field
|
|
28
|
-
from datetime import datetime
|
|
25
|
+
from datetime import datetime, timezone
|
|
29
26
|
from enum import Enum
|
|
30
27
|
from pathlib import Path
|
|
31
|
-
from typing import Dict, List, Optional,
|
|
28
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
32
29
|
|
|
33
30
|
import yaml
|
|
34
31
|
|
|
35
32
|
from claude_mpm.core.base_service import BaseService
|
|
36
33
|
from claude_mpm.core.config import Config
|
|
37
|
-
from claude_mpm.
|
|
38
|
-
from claude_mpm.
|
|
39
|
-
from claude_mpm.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
logger = logging.getLogger(__name__)
|
|
34
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
35
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
36
|
+
from claude_mpm.services.agents.registry import AgentRegistry
|
|
37
|
+
from claude_mpm.services.memory.cache.shared_prompt_cache import SharedPromptCache
|
|
43
38
|
|
|
39
|
+
logger = get_logger(__name__)
|
|
44
40
|
|
|
45
41
|
# ============================================================================
|
|
46
42
|
# Data Models
|
|
47
43
|
# ============================================================================
|
|
48
44
|
|
|
45
|
+
|
|
49
46
|
class ProfileTier(Enum):
|
|
50
|
-
"""Agent profile hierarchy tiers."""
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
47
|
+
"""Agent profile hierarchy tiers with precedence order."""
|
|
48
|
+
|
|
49
|
+
PROJECT = "project" # Highest precedence - project-specific agents
|
|
50
|
+
USER = "user" # Medium precedence - user-level agents
|
|
51
|
+
SYSTEM = "system" # Lowest precedence - framework/built-in agents
|
|
54
52
|
|
|
55
53
|
|
|
56
54
|
class ProfileStatus(Enum):
|
|
57
55
|
"""Profile loading status."""
|
|
56
|
+
|
|
58
57
|
LOADED = "loaded"
|
|
59
58
|
ERROR = "error"
|
|
60
59
|
NOT_FOUND = "not_found"
|
|
@@ -64,6 +63,7 @@ class ProfileStatus(Enum):
|
|
|
64
63
|
@dataclass
|
|
65
64
|
class ImprovedPrompt:
|
|
66
65
|
"""Improved prompt data structure."""
|
|
66
|
+
|
|
67
67
|
prompt_id: str
|
|
68
68
|
agent_name: str
|
|
69
69
|
version: str
|
|
@@ -77,6 +77,7 @@ class ImprovedPrompt:
|
|
|
77
77
|
@dataclass
|
|
78
78
|
class AgentProfile:
|
|
79
79
|
"""Complete agent profile with hierarchy information."""
|
|
80
|
+
|
|
80
81
|
name: str
|
|
81
82
|
role: str
|
|
82
83
|
description: str
|
|
@@ -97,57 +98,60 @@ class AgentProfile:
|
|
|
97
98
|
# Main Service Class
|
|
98
99
|
# ============================================================================
|
|
99
100
|
|
|
101
|
+
|
|
100
102
|
class AgentProfileLoader(BaseService):
|
|
101
103
|
"""
|
|
102
104
|
Comprehensive agent profile loading service with enhanced prompt integration.
|
|
103
|
-
|
|
105
|
+
|
|
104
106
|
This consolidated version combines all functionality from the previous
|
|
105
107
|
multi-file implementation into a single, maintainable module.
|
|
106
108
|
"""
|
|
107
|
-
|
|
109
|
+
|
|
108
110
|
def __init__(self, config: Optional[Config] = None):
|
|
109
111
|
"""Initialize the agent profile loader."""
|
|
110
112
|
super().__init__(name="agent_profile_loader", config=config)
|
|
111
|
-
|
|
113
|
+
|
|
112
114
|
# Core configuration
|
|
113
|
-
self.working_directory = Path(
|
|
115
|
+
self.working_directory = Path(Path.cwd())
|
|
114
116
|
self.framework_path = self._detect_framework_path()
|
|
115
117
|
self.user_home = Path.home()
|
|
116
|
-
|
|
118
|
+
|
|
117
119
|
# Tier paths configuration
|
|
118
120
|
self.tier_paths = {
|
|
119
|
-
ProfileTier.PROJECT: self.working_directory /
|
|
120
|
-
ProfileTier.USER:
|
|
121
|
-
ProfileTier.SYSTEM: Path(__file__).parent.parent /
|
|
121
|
+
ProfileTier.PROJECT: self.working_directory / "agents",
|
|
122
|
+
ProfileTier.USER: get_path_manager().get_user_agents_dir(),
|
|
123
|
+
ProfileTier.SYSTEM: Path(__file__).parent.parent / "agents" / "templates",
|
|
122
124
|
}
|
|
123
|
-
|
|
125
|
+
|
|
124
126
|
# Remove None values
|
|
125
127
|
self.tier_paths = {k: v for k, v in self.tier_paths.items() if v is not None}
|
|
126
|
-
|
|
128
|
+
|
|
127
129
|
# Profile cache
|
|
128
130
|
self.profile_cache: Dict[str, AgentProfile] = {}
|
|
129
131
|
self.cache_ttl = 3600 # 1 hour
|
|
130
|
-
|
|
132
|
+
|
|
131
133
|
# Service integrations
|
|
132
134
|
self.shared_cache: Optional[SharedPromptCache] = None
|
|
133
135
|
self.agent_registry: Optional[AgentRegistry] = None
|
|
134
|
-
|
|
136
|
+
|
|
135
137
|
# Improved prompts storage
|
|
136
|
-
self.improved_prompts_path =
|
|
138
|
+
self.improved_prompts_path = (
|
|
139
|
+
get_path_manager().get_user_config_dir() / "improved_prompts"
|
|
140
|
+
)
|
|
137
141
|
self.improved_prompts_path.mkdir(parents=True, exist_ok=True)
|
|
138
|
-
|
|
142
|
+
|
|
139
143
|
# Performance tracking
|
|
140
144
|
self.load_metrics: Dict[str, float] = {}
|
|
141
|
-
|
|
142
|
-
logger.info(
|
|
145
|
+
|
|
146
|
+
logger.info("AgentProfileLoader initialized successfully")
|
|
143
147
|
logger.info(f" Working directory: {self.working_directory}")
|
|
144
148
|
logger.info(f" Framework path: {self.framework_path}")
|
|
145
149
|
logger.info(f" Tier paths: {list(self.tier_paths.keys())}")
|
|
146
|
-
|
|
150
|
+
|
|
147
151
|
async def _initialize(self) -> None:
|
|
148
152
|
"""Initialize the service and its integrations."""
|
|
149
153
|
logger.info("Initializing AgentProfileLoader service...")
|
|
150
|
-
|
|
154
|
+
|
|
151
155
|
# Initialize service integrations
|
|
152
156
|
try:
|
|
153
157
|
self.shared_cache = SharedPromptCache.get_instance()
|
|
@@ -155,116 +159,130 @@ class AgentProfileLoader(BaseService):
|
|
|
155
159
|
logger.info("Successfully initialized service integrations")
|
|
156
160
|
except Exception as e:
|
|
157
161
|
logger.warning(f"Failed to initialize some integrations: {e}")
|
|
158
|
-
|
|
162
|
+
|
|
159
163
|
# Discover and cache initial profiles
|
|
160
164
|
await self._discover_all_profiles()
|
|
161
|
-
|
|
165
|
+
|
|
162
166
|
logger.info("AgentProfileLoader service initialized successfully")
|
|
163
|
-
|
|
167
|
+
|
|
164
168
|
async def _cleanup(self) -> None:
|
|
165
169
|
"""Cleanup service resources."""
|
|
166
170
|
logger.info("Cleaning up AgentProfileLoader service...")
|
|
167
|
-
|
|
171
|
+
|
|
168
172
|
# Clear caches
|
|
169
173
|
self.profile_cache.clear()
|
|
170
|
-
|
|
174
|
+
|
|
171
175
|
# Save any pending improved prompts
|
|
172
176
|
await self._save_improved_prompts()
|
|
173
|
-
|
|
177
|
+
|
|
174
178
|
logger.info("AgentProfileLoader service cleaned up")
|
|
175
|
-
|
|
179
|
+
|
|
176
180
|
async def _health_check(self) -> Dict[str, bool]:
|
|
177
181
|
"""Perform service health checks."""
|
|
178
182
|
checks = {}
|
|
179
|
-
|
|
183
|
+
|
|
180
184
|
try:
|
|
181
185
|
# Check tier paths
|
|
182
186
|
checks["tier_paths_accessible"] = all(
|
|
183
187
|
path.exists() for path in self.tier_paths.values()
|
|
184
188
|
)
|
|
185
|
-
|
|
189
|
+
|
|
186
190
|
# Check service integrations
|
|
187
191
|
checks["shared_cache_integration"] = self.shared_cache is not None
|
|
188
192
|
checks["agent_registry_integration"] = self.agent_registry is not None
|
|
189
|
-
|
|
193
|
+
|
|
190
194
|
# Check profile discovery
|
|
191
195
|
profile_count = len(self.profile_cache)
|
|
192
196
|
checks["profiles_loaded"] = profile_count > 0
|
|
193
|
-
|
|
197
|
+
|
|
194
198
|
# Check improved prompts storage
|
|
195
199
|
checks["improved_prompts_storage"] = self.improved_prompts_path.exists()
|
|
196
|
-
|
|
200
|
+
|
|
197
201
|
except Exception as e:
|
|
198
202
|
logger.error(f"Health check failed: {e}")
|
|
199
203
|
checks["health_check_error"] = False
|
|
200
|
-
|
|
204
|
+
|
|
201
205
|
return checks
|
|
202
|
-
|
|
206
|
+
|
|
203
207
|
# ========================================================================
|
|
204
208
|
# Core Profile Loading
|
|
205
209
|
# ========================================================================
|
|
206
|
-
|
|
207
|
-
async def load_agent_profile(
|
|
208
|
-
|
|
210
|
+
|
|
211
|
+
async def load_agent_profile(
|
|
212
|
+
self, agent_name: str, use_cache: bool = True
|
|
213
|
+
) -> Optional[AgentProfile]:
|
|
209
214
|
"""
|
|
210
215
|
Load agent profile with three-tier hierarchy precedence.
|
|
211
|
-
|
|
216
|
+
|
|
212
217
|
Args:
|
|
213
218
|
agent_name: Name of the agent to load
|
|
214
219
|
use_cache: Whether to use cached profile if available
|
|
215
|
-
|
|
220
|
+
|
|
216
221
|
Returns:
|
|
217
222
|
AgentProfile or None if not found
|
|
218
223
|
"""
|
|
219
224
|
start_time = asyncio.get_event_loop().time()
|
|
220
|
-
|
|
225
|
+
|
|
221
226
|
# Check cache first
|
|
222
227
|
if use_cache and agent_name in self.profile_cache:
|
|
223
228
|
profile = self.profile_cache[agent_name]
|
|
224
|
-
if (
|
|
225
|
-
|
|
229
|
+
if (
|
|
230
|
+
datetime.now(timezone.utc) - profile.loaded_at
|
|
231
|
+
).seconds < self.cache_ttl:
|
|
232
|
+
self.load_metrics[f"{agent_name}_cache_hit"] = (
|
|
233
|
+
asyncio.get_event_loop().time() - start_time
|
|
234
|
+
)
|
|
226
235
|
return profile
|
|
227
|
-
|
|
236
|
+
|
|
228
237
|
# Load profile with tier precedence
|
|
229
238
|
profile = await self._load_profile_with_precedence(agent_name)
|
|
230
|
-
|
|
239
|
+
|
|
231
240
|
if profile:
|
|
232
241
|
# Load improved prompts
|
|
233
242
|
profile.improved_prompts = await self._load_improved_prompts(agent_name)
|
|
234
|
-
|
|
243
|
+
|
|
235
244
|
# Cache the profile
|
|
236
245
|
self.profile_cache[agent_name] = profile
|
|
237
|
-
|
|
246
|
+
|
|
238
247
|
# Update metrics
|
|
239
|
-
self.load_metrics[f"{agent_name}_load_time"] =
|
|
240
|
-
|
|
248
|
+
self.load_metrics[f"{agent_name}_load_time"] = (
|
|
249
|
+
asyncio.get_event_loop().time() - start_time
|
|
250
|
+
)
|
|
251
|
+
|
|
241
252
|
# Integrate with SharedPromptCache if available
|
|
242
253
|
if self.shared_cache and profile.status == ProfileStatus.LOADED:
|
|
243
254
|
cache_key = f"agent_profile_{agent_name}"
|
|
244
255
|
await self.shared_cache.set_cached_result(cache_key, profile)
|
|
245
256
|
profile.cache_key = cache_key
|
|
246
|
-
|
|
257
|
+
|
|
247
258
|
return profile
|
|
248
|
-
|
|
249
|
-
async def _load_profile_with_precedence(
|
|
259
|
+
|
|
260
|
+
async def _load_profile_with_precedence(
|
|
261
|
+
self, agent_name: str
|
|
262
|
+
) -> Optional[AgentProfile]:
|
|
250
263
|
"""Load profile following tier precedence: Project → User → System."""
|
|
251
264
|
for tier in [ProfileTier.PROJECT, ProfileTier.USER, ProfileTier.SYSTEM]:
|
|
252
265
|
if tier not in self.tier_paths:
|
|
253
266
|
continue
|
|
254
|
-
|
|
267
|
+
|
|
255
268
|
profile = await self._load_profile_from_tier(agent_name, tier)
|
|
256
269
|
if profile and profile.status == ProfileStatus.LOADED:
|
|
257
270
|
return profile
|
|
258
|
-
|
|
271
|
+
|
|
259
272
|
return None
|
|
260
|
-
|
|
261
|
-
async def _load_profile_from_tier(
|
|
262
|
-
|
|
273
|
+
|
|
274
|
+
async def _load_profile_from_tier(
|
|
275
|
+
self, agent_name: str, tier: ProfileTier
|
|
276
|
+
) -> Optional[AgentProfile]:
|
|
263
277
|
"""Load profile from specific tier."""
|
|
264
278
|
tier_path = self.tier_paths[tier]
|
|
265
|
-
|
|
279
|
+
|
|
266
280
|
# Try different file formats and naming conventions
|
|
281
|
+
# Check .md files first (Claude Code format), then fall back to YAML/JSON
|
|
267
282
|
possible_files = [
|
|
283
|
+
tier_path / f"{agent_name}.md",
|
|
284
|
+
tier_path / f"{agent_name}_agent.md",
|
|
285
|
+
tier_path / f"{agent_name}-agent.md",
|
|
268
286
|
tier_path / f"{agent_name}.yaml",
|
|
269
287
|
tier_path / f"{agent_name}.yml",
|
|
270
288
|
tier_path / f"{agent_name}.json",
|
|
@@ -275,332 +293,392 @@ class AgentProfileLoader(BaseService):
|
|
|
275
293
|
tier_path / f"{agent_name}-agent.yml",
|
|
276
294
|
tier_path / f"{agent_name}-agent.json",
|
|
277
295
|
]
|
|
278
|
-
|
|
296
|
+
|
|
279
297
|
for file_path in possible_files:
|
|
280
298
|
if file_path.exists():
|
|
281
299
|
return await self._parse_profile_file(file_path, tier)
|
|
282
|
-
|
|
300
|
+
|
|
283
301
|
return None
|
|
284
|
-
|
|
285
|
-
async def _parse_profile_file(
|
|
286
|
-
|
|
302
|
+
|
|
303
|
+
async def _parse_profile_file(
|
|
304
|
+
self, file_path: Path, tier: ProfileTier
|
|
305
|
+
) -> Optional[AgentProfile]:
|
|
287
306
|
"""Parse agent profile from file."""
|
|
288
307
|
try:
|
|
289
308
|
# Read file content
|
|
290
309
|
content = file_path.read_text()
|
|
291
|
-
|
|
310
|
+
|
|
292
311
|
# Parse based on file extension
|
|
293
|
-
if file_path.suffix
|
|
312
|
+
if file_path.suffix == ".md":
|
|
313
|
+
# Parse markdown with YAML frontmatter
|
|
314
|
+
data, instructions = self._parse_markdown_with_frontmatter(content)
|
|
315
|
+
elif file_path.suffix in [".yaml", ".yml"]:
|
|
294
316
|
data = yaml.safe_load(content)
|
|
295
|
-
|
|
317
|
+
instructions = data.get("instructions", "")
|
|
318
|
+
elif file_path.suffix == ".json":
|
|
296
319
|
data = json.loads(content)
|
|
320
|
+
instructions = data.get("instructions", "")
|
|
297
321
|
else:
|
|
298
322
|
# Try to parse as YAML first, then JSON
|
|
299
323
|
try:
|
|
300
324
|
data = yaml.safe_load(content)
|
|
301
|
-
|
|
325
|
+
instructions = data.get("instructions", "")
|
|
326
|
+
except Exception:
|
|
302
327
|
data = json.loads(content)
|
|
303
|
-
|
|
328
|
+
instructions = data.get("instructions", "")
|
|
329
|
+
|
|
304
330
|
# Create profile
|
|
305
|
-
|
|
306
|
-
name=data.get(
|
|
307
|
-
role=data.get(
|
|
308
|
-
description=data.get(
|
|
331
|
+
return AgentProfile(
|
|
332
|
+
name=data.get("name", file_path.stem),
|
|
333
|
+
role=data.get("role", "agent"),
|
|
334
|
+
description=data.get("description", ""),
|
|
309
335
|
tier=tier,
|
|
310
336
|
source_path=str(file_path),
|
|
311
|
-
instructions=
|
|
312
|
-
capabilities=data.get(
|
|
313
|
-
constraints=data.get(
|
|
314
|
-
metadata=data.get(
|
|
315
|
-
status=ProfileStatus.LOADED
|
|
337
|
+
instructions=instructions,
|
|
338
|
+
capabilities=data.get("capabilities", []),
|
|
339
|
+
constraints=data.get("constraints", []),
|
|
340
|
+
metadata=data.get("metadata", {}),
|
|
341
|
+
status=ProfileStatus.LOADED,
|
|
316
342
|
)
|
|
317
|
-
|
|
318
|
-
return profile
|
|
319
|
-
|
|
343
|
+
|
|
320
344
|
except Exception as e:
|
|
321
345
|
logger.error(f"Error parsing profile {file_path}: {e}")
|
|
322
346
|
return AgentProfile(
|
|
323
347
|
name=file_path.stem,
|
|
324
|
-
role=
|
|
325
|
-
description=
|
|
348
|
+
role="error",
|
|
349
|
+
description="Failed to load profile",
|
|
326
350
|
tier=tier,
|
|
327
351
|
source_path=str(file_path),
|
|
328
352
|
status=ProfileStatus.ERROR,
|
|
329
|
-
error=str(e)
|
|
353
|
+
error=str(e),
|
|
330
354
|
)
|
|
331
|
-
|
|
355
|
+
|
|
356
|
+
def _parse_markdown_with_frontmatter(
|
|
357
|
+
self, content: str
|
|
358
|
+
) -> Tuple[Dict[str, Any], str]:
|
|
359
|
+
"""
|
|
360
|
+
Parse markdown file with YAML frontmatter.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
content: Markdown content with YAML frontmatter
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
Tuple of (frontmatter_data, markdown_content)
|
|
367
|
+
"""
|
|
368
|
+
import re
|
|
369
|
+
|
|
370
|
+
# Check if content starts with YAML frontmatter
|
|
371
|
+
if not content.strip().startswith("---"):
|
|
372
|
+
# No frontmatter, treat entire content as instructions
|
|
373
|
+
return {"name": "unknown", "description": "No frontmatter found"}, content
|
|
374
|
+
|
|
375
|
+
# Split frontmatter and content
|
|
376
|
+
parts = re.split(r"^---\s*$", content, 2, re.MULTILINE)
|
|
377
|
+
|
|
378
|
+
if len(parts) < 3:
|
|
379
|
+
# Invalid frontmatter structure
|
|
380
|
+
return {"name": "unknown", "description": "Invalid frontmatter"}, content
|
|
381
|
+
|
|
382
|
+
# Parse YAML frontmatter
|
|
383
|
+
frontmatter_text = parts[1].strip()
|
|
384
|
+
markdown_content = parts[2].strip()
|
|
385
|
+
|
|
386
|
+
try:
|
|
387
|
+
frontmatter_data = yaml.safe_load(frontmatter_text)
|
|
388
|
+
if not isinstance(frontmatter_data, dict):
|
|
389
|
+
frontmatter_data = {
|
|
390
|
+
"name": "unknown",
|
|
391
|
+
"description": "Invalid frontmatter format",
|
|
392
|
+
}
|
|
393
|
+
except Exception as e:
|
|
394
|
+
logger.error(f"Error parsing YAML frontmatter: {e}")
|
|
395
|
+
frontmatter_data = {
|
|
396
|
+
"name": "unknown",
|
|
397
|
+
"description": f"YAML parse error: {e}",
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return frontmatter_data, markdown_content
|
|
401
|
+
|
|
332
402
|
# ========================================================================
|
|
333
403
|
# Profile Discovery
|
|
334
404
|
# ========================================================================
|
|
335
|
-
|
|
405
|
+
|
|
336
406
|
async def _discover_all_profiles(self) -> Dict[ProfileTier, List[str]]:
|
|
337
407
|
"""Discover all available agent profiles across tiers."""
|
|
338
408
|
discovered = {}
|
|
339
|
-
|
|
409
|
+
|
|
340
410
|
for tier, tier_path in self.tier_paths.items():
|
|
341
411
|
if not tier_path.exists():
|
|
342
412
|
continue
|
|
343
|
-
|
|
413
|
+
|
|
344
414
|
agents = []
|
|
345
|
-
for
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
agent_name =
|
|
350
|
-
|
|
351
|
-
agent_name
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
agents
|
|
355
|
-
|
|
415
|
+
# Check for .md files (Claude Code format) and YAML/JSON files
|
|
416
|
+
file_patterns = ["*.md", "*.yaml", "*.yml", "*.json"]
|
|
417
|
+
for pattern in file_patterns:
|
|
418
|
+
for file_path in tier_path.glob(pattern):
|
|
419
|
+
agent_name = file_path.stem
|
|
420
|
+
# Remove common suffixes
|
|
421
|
+
if agent_name.endswith(("_agent", "-agent")):
|
|
422
|
+
agent_name = agent_name[:-6]
|
|
423
|
+
|
|
424
|
+
if agent_name not in agents:
|
|
425
|
+
agents.append(agent_name)
|
|
426
|
+
|
|
356
427
|
discovered[tier] = agents
|
|
357
428
|
logger.debug(f"Discovered {len(agents)} agents in {tier.value} tier")
|
|
358
|
-
|
|
429
|
+
|
|
359
430
|
return discovered
|
|
360
|
-
|
|
361
|
-
async def get_available_agents(
|
|
431
|
+
|
|
432
|
+
async def get_available_agents(
|
|
433
|
+
self, tier: Optional[ProfileTier] = None
|
|
434
|
+
) -> List[str]:
|
|
362
435
|
"""Get list of available agents, optionally filtered by tier."""
|
|
363
436
|
discovered = await self._discover_all_profiles()
|
|
364
|
-
|
|
437
|
+
|
|
365
438
|
if tier:
|
|
366
439
|
return discovered.get(tier, [])
|
|
367
|
-
|
|
440
|
+
|
|
368
441
|
# Combine all tiers, removing duplicates
|
|
369
442
|
all_agents = set()
|
|
370
443
|
for agents in discovered.values():
|
|
371
444
|
all_agents.update(agents)
|
|
372
|
-
|
|
373
|
-
return sorted(
|
|
374
|
-
|
|
445
|
+
|
|
446
|
+
return sorted(all_agents)
|
|
447
|
+
|
|
375
448
|
# ========================================================================
|
|
376
449
|
# Improved Prompts Management
|
|
377
450
|
# ========================================================================
|
|
378
|
-
|
|
451
|
+
|
|
379
452
|
async def _load_improved_prompts(self, agent_name: str) -> List[ImprovedPrompt]:
|
|
380
453
|
"""Load improved prompts for an agent."""
|
|
381
454
|
prompts = []
|
|
382
455
|
prompt_file = self.improved_prompts_path / f"{agent_name}_prompts.json"
|
|
383
|
-
|
|
456
|
+
|
|
384
457
|
if prompt_file.exists():
|
|
385
458
|
try:
|
|
386
|
-
with open(
|
|
459
|
+
with prompt_file.open() as f:
|
|
387
460
|
data = json.load(f)
|
|
388
461
|
for prompt_data in data:
|
|
389
462
|
prompt = ImprovedPrompt(
|
|
390
|
-
prompt_id=prompt_data[
|
|
391
|
-
agent_name=prompt_data[
|
|
392
|
-
version=prompt_data[
|
|
393
|
-
content=prompt_data[
|
|
394
|
-
metrics=prompt_data.get(
|
|
395
|
-
metadata=prompt_data.get(
|
|
396
|
-
created_at=datetime.fromisoformat(
|
|
397
|
-
|
|
463
|
+
prompt_id=prompt_data["prompt_id"],
|
|
464
|
+
agent_name=prompt_data["agent_name"],
|
|
465
|
+
version=prompt_data["version"],
|
|
466
|
+
content=prompt_data["content"],
|
|
467
|
+
metrics=prompt_data.get("metrics", {}),
|
|
468
|
+
metadata=prompt_data.get("metadata", {}),
|
|
469
|
+
created_at=datetime.fromisoformat(
|
|
470
|
+
prompt_data["created_at"]
|
|
471
|
+
),
|
|
472
|
+
validated=prompt_data.get("validated", False),
|
|
398
473
|
)
|
|
399
474
|
prompts.append(prompt)
|
|
400
475
|
except Exception as e:
|
|
401
476
|
logger.error(f"Error loading improved prompts for {agent_name}: {e}")
|
|
402
|
-
|
|
477
|
+
|
|
403
478
|
return prompts
|
|
404
|
-
|
|
405
|
-
async def save_improved_prompt(
|
|
406
|
-
|
|
479
|
+
|
|
480
|
+
async def save_improved_prompt(
|
|
481
|
+
self, agent_name: str, prompt: ImprovedPrompt
|
|
482
|
+
) -> bool:
|
|
407
483
|
"""Save an improved prompt for an agent."""
|
|
408
484
|
try:
|
|
409
485
|
# Load existing prompts
|
|
410
486
|
prompts = await self._load_improved_prompts(agent_name)
|
|
411
|
-
|
|
487
|
+
|
|
412
488
|
# Add or update prompt
|
|
413
489
|
existing_idx = None
|
|
414
490
|
for idx, existing in enumerate(prompts):
|
|
415
491
|
if existing.prompt_id == prompt.prompt_id:
|
|
416
492
|
existing_idx = idx
|
|
417
493
|
break
|
|
418
|
-
|
|
494
|
+
|
|
419
495
|
if existing_idx is not None:
|
|
420
496
|
prompts[existing_idx] = prompt
|
|
421
497
|
else:
|
|
422
498
|
prompts.append(prompt)
|
|
423
|
-
|
|
499
|
+
|
|
424
500
|
# Save to file
|
|
425
501
|
prompt_file = self.improved_prompts_path / f"{agent_name}_prompts.json"
|
|
426
|
-
with open(
|
|
427
|
-
json.dump(
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
502
|
+
with prompt_file.open("w") as f:
|
|
503
|
+
json.dump(
|
|
504
|
+
[
|
|
505
|
+
{
|
|
506
|
+
"prompt_id": p.prompt_id,
|
|
507
|
+
"agent_name": p.agent_name,
|
|
508
|
+
"version": p.version,
|
|
509
|
+
"content": p.content,
|
|
510
|
+
"metrics": p.metrics,
|
|
511
|
+
"metadata": p.metadata,
|
|
512
|
+
"created_at": p.created_at.isoformat(),
|
|
513
|
+
"validated": p.validated,
|
|
514
|
+
}
|
|
515
|
+
for p in prompts
|
|
516
|
+
],
|
|
517
|
+
f,
|
|
518
|
+
indent=2,
|
|
519
|
+
)
|
|
520
|
+
|
|
441
521
|
return True
|
|
442
|
-
|
|
522
|
+
|
|
443
523
|
except Exception as e:
|
|
444
524
|
logger.error(f"Error saving improved prompt: {e}")
|
|
445
525
|
return False
|
|
446
|
-
|
|
526
|
+
|
|
447
527
|
async def _save_improved_prompts(self) -> None:
|
|
448
528
|
"""Save all pending improved prompts."""
|
|
449
529
|
for agent_name, profile in self.profile_cache.items():
|
|
450
530
|
if profile.improved_prompts:
|
|
451
531
|
for prompt in profile.improved_prompts:
|
|
452
532
|
await self.save_improved_prompt(agent_name, prompt)
|
|
453
|
-
|
|
533
|
+
|
|
454
534
|
# ========================================================================
|
|
455
535
|
# Task Integration
|
|
456
536
|
# ========================================================================
|
|
457
|
-
|
|
458
|
-
async def enhance_task_creation(
|
|
459
|
-
|
|
537
|
+
|
|
538
|
+
async def enhance_task_creation(
|
|
539
|
+
self, agent_name: str, task_params: Dict[str, Any]
|
|
540
|
+
) -> Dict[str, Any]:
|
|
460
541
|
"""
|
|
461
542
|
Enhance Task Tool subprocess creation with agent profile data.
|
|
462
|
-
|
|
543
|
+
|
|
463
544
|
Args:
|
|
464
545
|
agent_name: Name of the agent
|
|
465
546
|
task_params: Original task parameters
|
|
466
|
-
|
|
547
|
+
|
|
467
548
|
Returns:
|
|
468
549
|
Enhanced task parameters
|
|
469
550
|
"""
|
|
470
551
|
profile = await self.load_agent_profile(agent_name)
|
|
471
|
-
|
|
552
|
+
|
|
472
553
|
if not profile:
|
|
473
554
|
logger.warning(f"No profile found for agent {agent_name}")
|
|
474
555
|
return task_params
|
|
475
|
-
|
|
556
|
+
|
|
476
557
|
# Enhance with profile data
|
|
477
558
|
enhanced = task_params.copy()
|
|
478
|
-
|
|
559
|
+
|
|
479
560
|
# Add agent metadata
|
|
480
|
-
enhanced[
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
561
|
+
enhanced["agent_metadata"] = {
|
|
562
|
+
"name": profile.name,
|
|
563
|
+
"role": profile.role,
|
|
564
|
+
"tier": profile.tier.value,
|
|
565
|
+
"capabilities": profile.capabilities,
|
|
566
|
+
"constraints": profile.constraints,
|
|
486
567
|
}
|
|
487
|
-
|
|
568
|
+
|
|
488
569
|
# Add improved prompts if available
|
|
489
570
|
if profile.improved_prompts:
|
|
490
571
|
best_prompt = max(
|
|
491
|
-
profile.improved_prompts,
|
|
492
|
-
key=lambda p: p.metrics.get('success_rate', 0)
|
|
572
|
+
profile.improved_prompts, key=lambda p: p.metrics.get("success_rate", 0)
|
|
493
573
|
)
|
|
494
|
-
enhanced[
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
574
|
+
enhanced["improved_prompt"] = {
|
|
575
|
+
"content": best_prompt.content,
|
|
576
|
+
"version": best_prompt.version,
|
|
577
|
+
"metrics": best_prompt.metrics,
|
|
498
578
|
}
|
|
499
|
-
|
|
579
|
+
|
|
500
580
|
# Add custom instructions if available
|
|
501
581
|
if profile.instructions:
|
|
502
|
-
enhanced[
|
|
503
|
-
|
|
582
|
+
enhanced["additional_instructions"] = profile.instructions
|
|
583
|
+
|
|
504
584
|
return enhanced
|
|
505
|
-
|
|
585
|
+
|
|
506
586
|
# ========================================================================
|
|
507
587
|
# Metrics and Validation
|
|
508
588
|
# ========================================================================
|
|
509
|
-
|
|
589
|
+
|
|
510
590
|
async def validate_profile(self, agent_name: str) -> Dict[str, Any]:
|
|
511
591
|
"""Validate agent profile structure and content."""
|
|
512
592
|
profile = await self.load_agent_profile(agent_name)
|
|
513
|
-
|
|
593
|
+
|
|
514
594
|
if not profile:
|
|
515
|
-
return {
|
|
516
|
-
|
|
517
|
-
validation_results = {
|
|
518
|
-
|
|
519
|
-
'warnings': [],
|
|
520
|
-
'errors': []
|
|
521
|
-
}
|
|
522
|
-
|
|
595
|
+
return {"valid": False, "error": "Profile not found"}
|
|
596
|
+
|
|
597
|
+
validation_results = {"valid": True, "warnings": [], "errors": []}
|
|
598
|
+
|
|
523
599
|
# Check required fields
|
|
524
600
|
if not profile.name:
|
|
525
|
-
validation_results[
|
|
526
|
-
validation_results[
|
|
527
|
-
|
|
601
|
+
validation_results["errors"].append("Missing agent name")
|
|
602
|
+
validation_results["valid"] = False
|
|
603
|
+
|
|
528
604
|
if not profile.role:
|
|
529
|
-
validation_results[
|
|
530
|
-
validation_results[
|
|
531
|
-
|
|
605
|
+
validation_results["errors"].append("Missing agent role")
|
|
606
|
+
validation_results["valid"] = False
|
|
607
|
+
|
|
532
608
|
# Check profile completeness
|
|
533
609
|
if not profile.description:
|
|
534
|
-
validation_results[
|
|
535
|
-
|
|
610
|
+
validation_results["warnings"].append("Missing agent description")
|
|
611
|
+
|
|
536
612
|
if not profile.capabilities:
|
|
537
|
-
validation_results[
|
|
538
|
-
|
|
613
|
+
validation_results["warnings"].append("No capabilities defined")
|
|
614
|
+
|
|
539
615
|
if not profile.constraints:
|
|
540
|
-
validation_results[
|
|
541
|
-
|
|
616
|
+
validation_results["warnings"].append("No constraints defined")
|
|
617
|
+
|
|
542
618
|
# Validate improved prompts
|
|
543
619
|
for prompt in profile.improved_prompts:
|
|
544
620
|
if not prompt.validated:
|
|
545
|
-
validation_results[
|
|
546
|
-
f
|
|
621
|
+
validation_results["warnings"].append(
|
|
622
|
+
f"Unvalidated prompt: {prompt.prompt_id}"
|
|
547
623
|
)
|
|
548
|
-
|
|
624
|
+
|
|
549
625
|
return validation_results
|
|
550
|
-
|
|
626
|
+
|
|
551
627
|
async def get_profile_metrics(self) -> Dict[str, Any]:
|
|
552
628
|
"""Get comprehensive profile loading metrics."""
|
|
553
629
|
metrics = {
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
630
|
+
"cache_size": len(self.profile_cache),
|
|
631
|
+
"load_metrics": self.load_metrics,
|
|
632
|
+
"tier_stats": {},
|
|
557
633
|
}
|
|
558
|
-
|
|
634
|
+
|
|
559
635
|
# Count profiles by tier
|
|
560
636
|
for profile in self.profile_cache.values():
|
|
561
637
|
tier = profile.tier.value
|
|
562
|
-
metrics[
|
|
563
|
-
|
|
638
|
+
metrics["tier_stats"][tier] = metrics["tier_stats"].get(tier, 0) + 1
|
|
639
|
+
|
|
564
640
|
# Calculate average load times
|
|
565
641
|
if self.load_metrics:
|
|
566
|
-
load_times = [
|
|
642
|
+
load_times = [
|
|
643
|
+
v for k, v in self.load_metrics.items() if k.endswith("_load_time")
|
|
644
|
+
]
|
|
567
645
|
if load_times:
|
|
568
|
-
metrics[
|
|
569
|
-
|
|
646
|
+
metrics["avg_load_time"] = sum(load_times) / len(load_times)
|
|
647
|
+
|
|
570
648
|
# Count improved prompts
|
|
571
649
|
total_prompts = sum(
|
|
572
650
|
len(p.improved_prompts) for p in self.profile_cache.values()
|
|
573
651
|
)
|
|
574
|
-
metrics[
|
|
575
|
-
|
|
652
|
+
metrics["total_improved_prompts"] = total_prompts
|
|
653
|
+
|
|
576
654
|
return metrics
|
|
577
|
-
|
|
655
|
+
|
|
578
656
|
# ========================================================================
|
|
579
657
|
# Utility Methods
|
|
580
658
|
# ========================================================================
|
|
581
|
-
|
|
659
|
+
|
|
582
660
|
def _detect_framework_path(self) -> Optional[Path]:
|
|
583
661
|
"""Detect the framework path for system-level agents."""
|
|
584
662
|
possible_paths = [
|
|
585
|
-
self.working_directory /
|
|
586
|
-
self.working_directory /
|
|
587
|
-
Path(__file__).parent.parent /
|
|
663
|
+
self.working_directory / "framework",
|
|
664
|
+
self.working_directory / "src" / "claude_mpm" / "framework",
|
|
665
|
+
Path(__file__).parent.parent / "framework",
|
|
588
666
|
]
|
|
589
|
-
|
|
667
|
+
|
|
590
668
|
for path in possible_paths:
|
|
591
|
-
if path.exists() and (path /
|
|
669
|
+
if path.exists() and (path / "agent-roles").exists():
|
|
592
670
|
return path
|
|
593
|
-
|
|
671
|
+
|
|
594
672
|
return None
|
|
595
|
-
|
|
673
|
+
|
|
596
674
|
def invalidate_cache(self, agent_name: Optional[str] = None) -> None:
|
|
597
675
|
"""Invalidate profile cache."""
|
|
598
676
|
if agent_name:
|
|
599
677
|
self.profile_cache.pop(agent_name, None)
|
|
600
678
|
else:
|
|
601
679
|
self.profile_cache.clear()
|
|
602
|
-
|
|
680
|
+
|
|
603
681
|
async def reload_profile(self, agent_name: str) -> Optional[AgentProfile]:
|
|
604
682
|
"""Force reload of agent profile, bypassing cache."""
|
|
605
683
|
self.invalidate_cache(agent_name)
|
|
606
|
-
return await self.load_agent_profile(agent_name, use_cache=False)
|
|
684
|
+
return await self.load_agent_profile(agent_name, use_cache=False)
|