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
|
@@ -1,472 +1,543 @@
|
|
|
1
|
-
"""Framework loader for Claude MPM."""
|
|
1
|
+
"""Framework loader for Claude MPM - Refactored modular version."""
|
|
2
2
|
|
|
3
|
+
import asyncio
|
|
3
4
|
import os
|
|
4
|
-
import logging
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import
|
|
7
|
-
from datetime import datetime
|
|
6
|
+
from typing import Any, Dict, List, Optional, Set
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
# Import framework components
|
|
9
|
+
from claude_mpm.core.framework import (
|
|
10
|
+
AgentLoader,
|
|
11
|
+
CapabilityGenerator,
|
|
12
|
+
ContentFormatter,
|
|
13
|
+
ContextGenerator,
|
|
14
|
+
FileLoader,
|
|
15
|
+
InstructionLoader,
|
|
16
|
+
MemoryProcessor,
|
|
17
|
+
MetadataProcessor,
|
|
18
|
+
PackagedLoader,
|
|
19
|
+
TemplateProcessor,
|
|
20
|
+
)
|
|
21
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
22
|
+
from claude_mpm.utils.imports import safe_import
|
|
10
23
|
|
|
11
|
-
# Import with fallback support
|
|
12
|
-
|
|
13
|
-
|
|
24
|
+
# Import with fallback support
|
|
25
|
+
AgentRegistryAdapter = safe_import(
|
|
26
|
+
"claude_mpm.core.agent_registry", "core.agent_registry", ["AgentRegistryAdapter"]
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# Import API validator
|
|
30
|
+
try:
|
|
31
|
+
from claude_mpm.core.api_validator import validate_api_keys
|
|
32
|
+
except ImportError:
|
|
33
|
+
from ..core.api_validator import validate_api_keys
|
|
34
|
+
|
|
35
|
+
# Import the service container and interfaces
|
|
36
|
+
try:
|
|
37
|
+
from claude_mpm.services.core.cache_manager import CacheManager
|
|
38
|
+
from claude_mpm.services.core.memory_manager import MemoryManager
|
|
39
|
+
from claude_mpm.services.core.path_resolver import PathResolver
|
|
40
|
+
from claude_mpm.services.core.service_container import (
|
|
41
|
+
ServiceContainer,
|
|
42
|
+
get_global_container,
|
|
43
|
+
)
|
|
44
|
+
from claude_mpm.services.core.service_interfaces import (
|
|
45
|
+
ICacheManager,
|
|
46
|
+
IMemoryManager,
|
|
47
|
+
IPathResolver,
|
|
48
|
+
)
|
|
49
|
+
except ImportError:
|
|
50
|
+
# Fallback for development environments
|
|
51
|
+
from ..services.core.cache_manager import CacheManager
|
|
52
|
+
from ..services.core.memory_manager import MemoryManager
|
|
53
|
+
from ..services.core.path_resolver import PathResolver
|
|
54
|
+
from ..services.core.service_container import ServiceContainer, get_global_container
|
|
55
|
+
from ..services.core.service_interfaces import (
|
|
56
|
+
ICacheManager,
|
|
57
|
+
IMemoryManager,
|
|
58
|
+
IPathResolver,
|
|
59
|
+
)
|
|
14
60
|
|
|
15
61
|
|
|
16
62
|
class FrameworkLoader:
|
|
17
63
|
"""
|
|
18
64
|
Load and prepare framework instructions for injection.
|
|
19
|
-
|
|
20
|
-
This
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
65
|
+
|
|
66
|
+
This refactored version uses modular components for better maintainability
|
|
67
|
+
and testability while maintaining backward compatibility.
|
|
68
|
+
|
|
69
|
+
Components:
|
|
70
|
+
- Loaders: Handle file I/O and resource loading
|
|
71
|
+
- Formatters: Generate and format content sections
|
|
72
|
+
- Processors: Process metadata, templates, and memories
|
|
25
73
|
"""
|
|
26
|
-
|
|
27
|
-
def __init__(
|
|
74
|
+
|
|
75
|
+
def __init__(
|
|
76
|
+
self,
|
|
77
|
+
framework_path: Optional[Path] = None,
|
|
78
|
+
agents_dir: Optional[Path] = None,
|
|
79
|
+
service_container: Optional[ServiceContainer] = None,
|
|
80
|
+
config: Optional[Dict[str, Any]] = None,
|
|
81
|
+
):
|
|
28
82
|
"""
|
|
29
|
-
Initialize framework loader.
|
|
30
|
-
|
|
83
|
+
Initialize framework loader with modular components.
|
|
84
|
+
|
|
31
85
|
Args:
|
|
32
86
|
framework_path: Explicit path to framework (auto-detected if None)
|
|
33
87
|
agents_dir: Custom agents directory (overrides framework agents)
|
|
88
|
+
service_container: Optional service container for dependency injection
|
|
89
|
+
config: Optional configuration dictionary for API validation and other settings
|
|
34
90
|
"""
|
|
35
91
|
self.logger = get_logger("framework_loader")
|
|
36
|
-
self.framework_path = framework_path or self._detect_framework_path()
|
|
37
92
|
self.agents_dir = agents_dir
|
|
38
93
|
self.framework_version = None
|
|
39
94
|
self.framework_last_modified = None
|
|
95
|
+
self.config = config or {}
|
|
96
|
+
|
|
97
|
+
# Validate API keys on startup (before any other initialization)
|
|
98
|
+
self._validate_api_keys()
|
|
99
|
+
|
|
100
|
+
# Initialize service container
|
|
101
|
+
self.container = service_container or get_global_container()
|
|
102
|
+
self._register_services()
|
|
103
|
+
|
|
104
|
+
# Resolve services from container
|
|
105
|
+
self._cache_manager = self.container.resolve(ICacheManager)
|
|
106
|
+
self._path_resolver = self.container.resolve(IPathResolver)
|
|
107
|
+
self._memory_manager = self.container.resolve(IMemoryManager)
|
|
108
|
+
|
|
109
|
+
# Initialize framework path
|
|
110
|
+
self.framework_path = (
|
|
111
|
+
framework_path or self._path_resolver.detect_framework_path()
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Initialize modular components
|
|
115
|
+
self._init_components()
|
|
116
|
+
|
|
117
|
+
# Keep cache TTL constants for backward compatibility
|
|
118
|
+
self._init_cache_ttl()
|
|
119
|
+
|
|
120
|
+
# Load framework content
|
|
40
121
|
self.framework_content = self._load_framework_content()
|
|
41
|
-
|
|
122
|
+
|
|
42
123
|
# Initialize agent registry
|
|
43
124
|
self.agent_registry = AgentRegistryAdapter(self.framework_path)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"""Get npm global installation path."""
|
|
78
|
-
try:
|
|
79
|
-
import subprocess
|
|
80
|
-
result = subprocess.run(
|
|
81
|
-
["npm", "root", "-g"],
|
|
82
|
-
capture_output=True,
|
|
83
|
-
text=True,
|
|
84
|
-
timeout=5
|
|
125
|
+
|
|
126
|
+
# Output style manager (deferred initialization)
|
|
127
|
+
self.output_style_manager = None
|
|
128
|
+
|
|
129
|
+
def _validate_api_keys(self) -> None:
|
|
130
|
+
"""Validate API keys if enabled in config."""
|
|
131
|
+
if self.config.get("validate_api_keys", True):
|
|
132
|
+
try:
|
|
133
|
+
self.logger.info("Validating configured API keys...")
|
|
134
|
+
validate_api_keys(config=self.config, strict=True)
|
|
135
|
+
self.logger.info("✅ API key validation completed successfully")
|
|
136
|
+
except ValueError as e:
|
|
137
|
+
self.logger.error(f"❌ API key validation failed: {e}")
|
|
138
|
+
raise
|
|
139
|
+
except Exception as e:
|
|
140
|
+
self.logger.error(f"❌ Unexpected error during API validation: {e}")
|
|
141
|
+
raise
|
|
142
|
+
|
|
143
|
+
def _register_services(self) -> None:
|
|
144
|
+
"""Register services in the container if not already registered."""
|
|
145
|
+
if not self.container.is_registered(ICacheManager):
|
|
146
|
+
self.container.register(ICacheManager, CacheManager, True)
|
|
147
|
+
|
|
148
|
+
if not self.container.is_registered(IPathResolver):
|
|
149
|
+
cache_manager = self.container.resolve(ICacheManager)
|
|
150
|
+
path_resolver = PathResolver(cache_manager=cache_manager)
|
|
151
|
+
self.container.register_instance(IPathResolver, path_resolver)
|
|
152
|
+
|
|
153
|
+
if not self.container.is_registered(IMemoryManager):
|
|
154
|
+
cache_manager = self.container.resolve(ICacheManager)
|
|
155
|
+
path_resolver = self.container.resolve(IPathResolver)
|
|
156
|
+
memory_manager = MemoryManager(
|
|
157
|
+
cache_manager=cache_manager, path_resolver=path_resolver
|
|
85
158
|
)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
# Extract metadata if present
|
|
138
|
-
import re
|
|
139
|
-
version_match = re.search(r'<!-- FRAMEWORK_VERSION: (\d+) -->', content)
|
|
140
|
-
if version_match:
|
|
141
|
-
version = version_match.group(1) # Keep as string to preserve leading zeros
|
|
142
|
-
self.logger.info(f"Framework version: {version}")
|
|
143
|
-
# Store framework version if this is the main INSTRUCTIONS.md
|
|
144
|
-
if 'INSTRUCTIONS.md' in str(file_path):
|
|
145
|
-
self.framework_version = version
|
|
146
|
-
|
|
147
|
-
# Extract modification timestamp
|
|
148
|
-
timestamp_match = re.search(r'<!-- LAST_MODIFIED: ([^>]+) -->', content)
|
|
149
|
-
if timestamp_match:
|
|
150
|
-
timestamp = timestamp_match.group(1).strip()
|
|
151
|
-
self.logger.info(f"Last modified: {timestamp}")
|
|
152
|
-
# Store timestamp if this is the main INSTRUCTIONS.md
|
|
153
|
-
if 'INSTRUCTIONS.md' in str(file_path):
|
|
154
|
-
self.framework_last_modified = timestamp
|
|
155
|
-
|
|
156
|
-
return content
|
|
157
|
-
except Exception as e:
|
|
158
|
-
if hasattr(self.logger, 'level') and self.logger.level <= logging.ERROR:
|
|
159
|
-
self.logger.error(f"Failed to load {file_type}: {e}")
|
|
160
|
-
return None
|
|
161
|
-
|
|
162
|
-
def _load_instructions_file(self, content: Dict[str, Any]) -> None:
|
|
163
|
-
"""
|
|
164
|
-
Load INSTRUCTIONS.md or legacy CLAUDE.md from working directory.
|
|
165
|
-
|
|
166
|
-
Args:
|
|
167
|
-
content: Dictionary to update with loaded instructions
|
|
168
|
-
"""
|
|
169
|
-
working_instructions = Path.cwd() / "INSTRUCTIONS.md"
|
|
170
|
-
working_claude = Path.cwd() / "CLAUDE.md" # Legacy support
|
|
171
|
-
|
|
172
|
-
if working_instructions.exists():
|
|
173
|
-
loaded_content = self._try_load_file(working_instructions, "working directory INSTRUCTIONS.md")
|
|
174
|
-
if loaded_content:
|
|
175
|
-
content["working_claude_md"] = loaded_content
|
|
176
|
-
elif working_claude.exists():
|
|
177
|
-
# Legacy support for CLAUDE.md
|
|
178
|
-
loaded_content = self._try_load_file(working_claude, "working directory CLAUDE.md (legacy)")
|
|
179
|
-
if loaded_content:
|
|
180
|
-
content["working_claude_md"] = loaded_content
|
|
181
|
-
|
|
182
|
-
def _load_single_agent(self, agent_file: Path) -> tuple[Optional[str], Optional[str]]:
|
|
183
|
-
"""
|
|
184
|
-
Load a single agent file.
|
|
185
|
-
|
|
186
|
-
Args:
|
|
187
|
-
agent_file: Path to the agent file
|
|
188
|
-
|
|
189
|
-
Returns:
|
|
190
|
-
Tuple of (agent_name, agent_content) or (None, None) on failure
|
|
191
|
-
"""
|
|
192
|
-
try:
|
|
193
|
-
agent_name = agent_file.stem
|
|
194
|
-
# Skip README files
|
|
195
|
-
if agent_name.upper() == "README":
|
|
196
|
-
return None, None
|
|
197
|
-
content = agent_file.read_text()
|
|
198
|
-
self.logger.debug(f"Loaded agent: {agent_name}")
|
|
199
|
-
return agent_name, content
|
|
200
|
-
except Exception as e:
|
|
201
|
-
self.logger.error(f"Failed to load agent {agent_file}: {e}")
|
|
202
|
-
return None, None
|
|
203
|
-
|
|
204
|
-
def _load_base_agent_fallback(self, content: Dict[str, Any], main_dir: Optional[Path]) -> None:
|
|
205
|
-
"""
|
|
206
|
-
Load base_agent.md from main directory as fallback.
|
|
207
|
-
|
|
208
|
-
Args:
|
|
209
|
-
content: Dictionary to update with base agent
|
|
210
|
-
main_dir: Main agents directory path
|
|
211
|
-
"""
|
|
212
|
-
if main_dir and main_dir.exists() and "base_agent" not in content["agents"]:
|
|
213
|
-
base_agent_file = main_dir / "base_agent.md"
|
|
214
|
-
if base_agent_file.exists():
|
|
215
|
-
agent_name, agent_content = self._load_single_agent(base_agent_file)
|
|
216
|
-
if agent_name and agent_content:
|
|
217
|
-
content["agents"][agent_name] = agent_content
|
|
218
|
-
|
|
219
|
-
def _load_agents_directory(self, content: Dict[str, Any], agents_dir: Optional[Path],
|
|
220
|
-
templates_dir: Optional[Path], main_dir: Optional[Path]) -> None:
|
|
221
|
-
"""
|
|
222
|
-
Load agent definitions from the appropriate directory.
|
|
223
|
-
|
|
224
|
-
Args:
|
|
225
|
-
content: Dictionary to update with loaded agents
|
|
226
|
-
agents_dir: Primary agents directory to load from
|
|
227
|
-
templates_dir: Templates directory path
|
|
228
|
-
main_dir: Main agents directory path
|
|
229
|
-
"""
|
|
230
|
-
if not agents_dir or not agents_dir.exists():
|
|
231
|
-
return
|
|
232
|
-
|
|
233
|
-
content["loaded"] = True
|
|
234
|
-
|
|
235
|
-
# Load all agent files
|
|
236
|
-
for agent_file in agents_dir.glob("*.md"):
|
|
237
|
-
agent_name, agent_content = self._load_single_agent(agent_file)
|
|
238
|
-
if agent_name and agent_content:
|
|
239
|
-
content["agents"][agent_name] = agent_content
|
|
240
|
-
|
|
241
|
-
# If we used templates dir, also check main dir for base_agent.md
|
|
242
|
-
if agents_dir == templates_dir:
|
|
243
|
-
self._load_base_agent_fallback(content, main_dir)
|
|
244
|
-
|
|
159
|
+
self.container.register_instance(IMemoryManager, memory_manager)
|
|
160
|
+
|
|
161
|
+
def _init_components(self) -> None:
|
|
162
|
+
"""Initialize modular components."""
|
|
163
|
+
# Loaders
|
|
164
|
+
self.file_loader = FileLoader()
|
|
165
|
+
self.packaged_loader = PackagedLoader()
|
|
166
|
+
self.instruction_loader = InstructionLoader(self.framework_path)
|
|
167
|
+
self.agent_loader = AgentLoader(self.framework_path)
|
|
168
|
+
|
|
169
|
+
# Formatters
|
|
170
|
+
self.content_formatter = ContentFormatter()
|
|
171
|
+
self.capability_generator = CapabilityGenerator()
|
|
172
|
+
self.context_generator = ContextGenerator()
|
|
173
|
+
|
|
174
|
+
# Processors
|
|
175
|
+
self.metadata_processor = MetadataProcessor()
|
|
176
|
+
self.template_processor = TemplateProcessor(self.framework_path)
|
|
177
|
+
self.memory_processor = MemoryProcessor()
|
|
178
|
+
|
|
179
|
+
def _init_cache_ttl(self) -> None:
|
|
180
|
+
"""Initialize cache TTL constants for backward compatibility."""
|
|
181
|
+
if hasattr(self._cache_manager, "capabilities_ttl"):
|
|
182
|
+
self.CAPABILITIES_CACHE_TTL = self._cache_manager.capabilities_ttl
|
|
183
|
+
self.DEPLOYED_AGENTS_CACHE_TTL = self._cache_manager.deployed_agents_ttl
|
|
184
|
+
self.METADATA_CACHE_TTL = self._cache_manager.metadata_ttl
|
|
185
|
+
self.MEMORIES_CACHE_TTL = self._cache_manager.memories_ttl
|
|
186
|
+
else:
|
|
187
|
+
# Default TTL values
|
|
188
|
+
self.CAPABILITIES_CACHE_TTL = 60
|
|
189
|
+
self.DEPLOYED_AGENTS_CACHE_TTL = 30
|
|
190
|
+
self.METADATA_CACHE_TTL = 60
|
|
191
|
+
self.MEMORIES_CACHE_TTL = 60
|
|
192
|
+
|
|
193
|
+
# === Cache Management Methods (backward compatibility) ===
|
|
194
|
+
|
|
195
|
+
def clear_all_caches(self) -> None:
|
|
196
|
+
"""Clear all caches to force reload on next access."""
|
|
197
|
+
self._cache_manager.clear_all()
|
|
198
|
+
|
|
199
|
+
def clear_agent_caches(self) -> None:
|
|
200
|
+
"""Clear agent-related caches."""
|
|
201
|
+
self._cache_manager.clear_agent_caches()
|
|
202
|
+
|
|
203
|
+
def clear_memory_caches(self) -> None:
|
|
204
|
+
"""Clear memory-related caches."""
|
|
205
|
+
self._cache_manager.clear_memory_caches()
|
|
206
|
+
|
|
207
|
+
# === Content Loading Methods ===
|
|
208
|
+
|
|
245
209
|
def _load_framework_content(self) -> Dict[str, Any]:
|
|
246
|
-
"""Load framework content."""
|
|
210
|
+
"""Load framework content using modular components."""
|
|
247
211
|
content = {
|
|
248
212
|
"claude_md": "",
|
|
249
213
|
"agents": {},
|
|
250
214
|
"version": "unknown",
|
|
251
215
|
"loaded": False,
|
|
252
216
|
"working_claude_md": "",
|
|
253
|
-
"framework_instructions": ""
|
|
217
|
+
"framework_instructions": "",
|
|
218
|
+
"workflow_instructions": "",
|
|
219
|
+
"workflow_instructions_level": "",
|
|
220
|
+
"memory_instructions": "",
|
|
221
|
+
"memory_instructions_level": "",
|
|
222
|
+
"project_workflow": "", # Deprecated
|
|
223
|
+
"project_memory": "", # Deprecated
|
|
224
|
+
"actual_memories": "",
|
|
225
|
+
"agent_memories": {},
|
|
254
226
|
}
|
|
255
|
-
|
|
256
|
-
# Load instructions
|
|
257
|
-
self.
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
# Load agents from discovered directory
|
|
281
|
-
self._load_agents_directory(content, agents_dir, templates_dir, main_dir)
|
|
282
|
-
|
|
227
|
+
|
|
228
|
+
# Load all instructions
|
|
229
|
+
self.instruction_loader.load_all_instructions(content)
|
|
230
|
+
|
|
231
|
+
# Transfer metadata from loaders
|
|
232
|
+
if self.file_loader.framework_version:
|
|
233
|
+
self.framework_version = self.file_loader.framework_version
|
|
234
|
+
content["version"] = self.framework_version
|
|
235
|
+
if self.file_loader.framework_last_modified:
|
|
236
|
+
self.framework_last_modified = self.file_loader.framework_last_modified
|
|
237
|
+
|
|
238
|
+
# Load memories
|
|
239
|
+
self._load_actual_memories(content)
|
|
240
|
+
|
|
241
|
+
# Discover and load agents
|
|
242
|
+
agents_dir, templates_dir, main_dir = self._path_resolver.discover_agent_paths(
|
|
243
|
+
agents_dir=self.agents_dir, framework_path=self.framework_path
|
|
244
|
+
)
|
|
245
|
+
agents = self.agent_loader.load_agents_directory(
|
|
246
|
+
agents_dir, templates_dir, main_dir
|
|
247
|
+
)
|
|
248
|
+
if agents:
|
|
249
|
+
content["agents"] = agents
|
|
250
|
+
content["loaded"] = True
|
|
251
|
+
|
|
283
252
|
return content
|
|
284
|
-
|
|
253
|
+
|
|
254
|
+
def _load_actual_memories(self, content: Dict[str, Any]) -> None:
|
|
255
|
+
"""Load actual memories using the MemoryManager service."""
|
|
256
|
+
memories = self._memory_manager.load_memories()
|
|
257
|
+
|
|
258
|
+
# Only load PM memories (PM.md)
|
|
259
|
+
# Agent memories are loaded at deployment time in agent_template_builder.py
|
|
260
|
+
if "actual_memories" in memories:
|
|
261
|
+
content["actual_memories"] = memories["actual_memories"]
|
|
262
|
+
# NOTE: agent_memories are no longer loaded for PM instructions
|
|
263
|
+
# They are injected per-agent at deployment time
|
|
264
|
+
|
|
265
|
+
# === Agent Discovery Methods ===
|
|
266
|
+
|
|
267
|
+
def _get_deployed_agents(self) -> Set[str]:
|
|
268
|
+
"""Get deployed agents with caching."""
|
|
269
|
+
cached = self._cache_manager.get_deployed_agents()
|
|
270
|
+
if cached is not None:
|
|
271
|
+
return cached
|
|
272
|
+
|
|
273
|
+
deployed = self.agent_loader.get_deployed_agents()
|
|
274
|
+
self._cache_manager.set_deployed_agents(deployed)
|
|
275
|
+
return deployed
|
|
276
|
+
|
|
277
|
+
def _discover_local_json_templates(self) -> Dict[str, Dict[str, Any]]:
|
|
278
|
+
"""Discover local JSON agent templates."""
|
|
279
|
+
return self.agent_loader.discover_local_json_templates()
|
|
280
|
+
|
|
281
|
+
def _parse_agent_metadata(self, agent_file: Path) -> Optional[Dict[str, Any]]:
|
|
282
|
+
"""Parse agent metadata with caching."""
|
|
283
|
+
cache_key = str(agent_file)
|
|
284
|
+
file_mtime = agent_file.stat().st_mtime
|
|
285
|
+
|
|
286
|
+
# Try cache first
|
|
287
|
+
cached_result = self._cache_manager.get_agent_metadata(cache_key)
|
|
288
|
+
if cached_result is not None:
|
|
289
|
+
cached_data, cached_mtime = cached_result
|
|
290
|
+
if cached_mtime == file_mtime:
|
|
291
|
+
self.logger.debug(f"Using cached metadata for {agent_file.name}")
|
|
292
|
+
return cached_data
|
|
293
|
+
|
|
294
|
+
# Cache miss - parse the file
|
|
295
|
+
agent_data = self.metadata_processor.parse_agent_metadata(agent_file)
|
|
296
|
+
|
|
297
|
+
# Add routing information if not present
|
|
298
|
+
if agent_data and "routing" not in agent_data:
|
|
299
|
+
template_data = self.template_processor.load_template(agent_file.stem)
|
|
300
|
+
if template_data:
|
|
301
|
+
routing = self.template_processor.extract_routing(template_data)
|
|
302
|
+
if routing:
|
|
303
|
+
agent_data["routing"] = routing
|
|
304
|
+
memory_routing = self.template_processor.extract_memory_routing(
|
|
305
|
+
template_data
|
|
306
|
+
)
|
|
307
|
+
if memory_routing:
|
|
308
|
+
agent_data["memory_routing"] = memory_routing
|
|
309
|
+
|
|
310
|
+
# Cache the result
|
|
311
|
+
if agent_data:
|
|
312
|
+
self._cache_manager.set_agent_metadata(cache_key, agent_data, file_mtime)
|
|
313
|
+
|
|
314
|
+
return agent_data
|
|
315
|
+
|
|
316
|
+
# === Framework Instructions Generation ===
|
|
317
|
+
|
|
285
318
|
def get_framework_instructions(self) -> str:
|
|
286
319
|
"""
|
|
287
320
|
Get formatted framework instructions for injection.
|
|
288
|
-
|
|
321
|
+
|
|
289
322
|
Returns:
|
|
290
323
|
Complete framework instructions ready for injection
|
|
291
324
|
"""
|
|
292
|
-
|
|
293
|
-
|
|
325
|
+
# Log the system prompt if needed
|
|
326
|
+
self._log_system_prompt()
|
|
327
|
+
|
|
328
|
+
# Generate the instructions
|
|
329
|
+
if self.framework_content["loaded"]:
|
|
294
330
|
return self._format_full_framework()
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
return self._format_minimal_framework()
|
|
298
|
-
|
|
331
|
+
return self._format_minimal_framework()
|
|
332
|
+
|
|
299
333
|
def _format_full_framework(self) -> str:
|
|
300
|
-
"""Format full framework instructions."""
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
- NEVER perform direct implementation work yourself
|
|
330
|
-
|
|
331
|
-
"""
|
|
332
|
-
|
|
333
|
-
# Add working directory INSTRUCTIONS.md (or CLAUDE.md) if exists
|
|
334
|
-
if self.framework_content["working_claude_md"]:
|
|
335
|
-
instructions += f"""
|
|
336
|
-
## Working Directory Instructions
|
|
337
|
-
{self.framework_content["working_claude_md"]}
|
|
338
|
-
|
|
339
|
-
"""
|
|
340
|
-
|
|
341
|
-
# Add agent definitions
|
|
342
|
-
if self.framework_content["agents"]:
|
|
343
|
-
instructions += "## Available Agents\n\n"
|
|
344
|
-
instructions += "You have the following specialized agents available for delegation:\n\n"
|
|
345
|
-
|
|
346
|
-
# List agents with brief descriptions
|
|
347
|
-
agent_list = []
|
|
348
|
-
for agent_name in sorted(self.framework_content["agents"].keys()):
|
|
349
|
-
clean_name = agent_name.replace('-', ' ').replace('_', ' ').title()
|
|
350
|
-
if 'engineer' in agent_name.lower():
|
|
351
|
-
agent_list.append(f"- **Engineer Agent**: Code implementation and development")
|
|
352
|
-
elif 'qa' in agent_name.lower():
|
|
353
|
-
agent_list.append(f"- **QA Agent**: Testing and quality assurance")
|
|
354
|
-
elif 'documentation' in agent_name.lower():
|
|
355
|
-
agent_list.append(f"- **Documentation Agent**: Documentation creation and maintenance")
|
|
356
|
-
elif 'research' in agent_name.lower():
|
|
357
|
-
agent_list.append(f"- **Research Agent**: Investigation and analysis")
|
|
358
|
-
elif 'security' in agent_name.lower():
|
|
359
|
-
agent_list.append(f"- **Security Agent**: Security analysis and protection")
|
|
360
|
-
elif 'version' in agent_name.lower():
|
|
361
|
-
agent_list.append(f"- **Version Control Agent**: Git operations and version management")
|
|
362
|
-
elif 'ops' in agent_name.lower():
|
|
363
|
-
agent_list.append(f"- **Ops Agent**: Deployment and operations")
|
|
364
|
-
elif 'data' in agent_name.lower():
|
|
365
|
-
agent_list.append(f"- **Data Engineer Agent**: Data management and AI API integration")
|
|
366
|
-
else:
|
|
367
|
-
agent_list.append(f"- **{clean_name}**: Available for specialized tasks")
|
|
368
|
-
|
|
369
|
-
instructions += "\n".join(agent_list) + "\n\n"
|
|
370
|
-
|
|
371
|
-
# Add full agent details
|
|
372
|
-
instructions += "### Agent Details\n\n"
|
|
373
|
-
for agent_name, agent_content in sorted(self.framework_content["agents"].items()):
|
|
374
|
-
instructions += f"#### {agent_name.replace('-', ' ').title()}\n"
|
|
375
|
-
instructions += agent_content + "\n\n"
|
|
376
|
-
|
|
377
|
-
# Add orchestration principles
|
|
378
|
-
instructions += """
|
|
379
|
-
## Orchestration Principles
|
|
380
|
-
1. **Always Delegate**: Never perform direct work - use Task Tool for all implementation
|
|
381
|
-
2. **Comprehensive Context**: Provide rich, filtered context to each agent
|
|
382
|
-
3. **Track Everything**: Extract all TODO/BUG/FEATURE items systematically
|
|
383
|
-
4. **Cross-Agent Coordination**: Orchestrate workflows spanning multiple agents
|
|
384
|
-
5. **Results Integration**: Actively receive and integrate agent results
|
|
385
|
-
|
|
386
|
-
## Task Tool Format
|
|
387
|
-
```
|
|
388
|
-
**[Agent Name]**: [Clear task description with deliverables]
|
|
389
|
-
|
|
390
|
-
TEMPORAL CONTEXT: Today is [date]. Apply date awareness to [specific considerations].
|
|
391
|
-
|
|
392
|
-
**Task**: [Detailed task breakdown]
|
|
393
|
-
1. [Specific action item 1]
|
|
394
|
-
2. [Specific action item 2]
|
|
395
|
-
3. [Specific action item 3]
|
|
396
|
-
|
|
397
|
-
**Context**: [Comprehensive filtered context for this agent]
|
|
398
|
-
**Authority**: [Agent's decision-making scope]
|
|
399
|
-
**Expected Results**: [Specific deliverables needed]
|
|
400
|
-
**Integration**: [How results integrate with other work]
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
## Ticket Extraction Patterns
|
|
404
|
-
Extract tickets from these patterns:
|
|
405
|
-
- TODO: [description] → TODO ticket
|
|
406
|
-
- BUG: [description] → BUG ticket
|
|
407
|
-
- FEATURE: [description] → FEATURE ticket
|
|
408
|
-
- ISSUE: [description] → ISSUE ticket
|
|
409
|
-
- FIXME: [description] → BUG ticket
|
|
410
|
-
|
|
411
|
-
---
|
|
412
|
-
"""
|
|
413
|
-
|
|
414
|
-
return instructions
|
|
415
|
-
|
|
334
|
+
"""Format full framework instructions using modular components."""
|
|
335
|
+
# Initialize output style manager on first use
|
|
336
|
+
if self.output_style_manager is None:
|
|
337
|
+
self._initialize_output_style()
|
|
338
|
+
|
|
339
|
+
# Check if we need to inject output style
|
|
340
|
+
inject_output_style = False
|
|
341
|
+
output_style_content = None
|
|
342
|
+
if self.output_style_manager:
|
|
343
|
+
inject_output_style = self.output_style_manager.should_inject_content()
|
|
344
|
+
if inject_output_style:
|
|
345
|
+
output_style_content = self.output_style_manager.get_injectable_content(
|
|
346
|
+
framework_loader=self
|
|
347
|
+
)
|
|
348
|
+
self.logger.info("Injecting output style content for Claude < 1.0.83")
|
|
349
|
+
|
|
350
|
+
# Generate dynamic sections
|
|
351
|
+
capabilities_section = self._generate_agent_capabilities_section()
|
|
352
|
+
context_section = self.context_generator.generate_temporal_user_context()
|
|
353
|
+
|
|
354
|
+
# Format the complete framework
|
|
355
|
+
return self.content_formatter.format_full_framework(
|
|
356
|
+
self.framework_content,
|
|
357
|
+
capabilities_section,
|
|
358
|
+
context_section,
|
|
359
|
+
inject_output_style,
|
|
360
|
+
output_style_content,
|
|
361
|
+
)
|
|
362
|
+
|
|
416
363
|
def _format_minimal_framework(self) -> str:
|
|
417
|
-
"""Format minimal framework instructions
|
|
418
|
-
return
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
364
|
+
"""Format minimal framework instructions."""
|
|
365
|
+
return self.content_formatter.format_minimal_framework(self.framework_content)
|
|
366
|
+
|
|
367
|
+
def _generate_agent_capabilities_section(self) -> str:
|
|
368
|
+
"""Generate agent capabilities section with caching."""
|
|
369
|
+
# Try cache first
|
|
370
|
+
cached_capabilities = self._cache_manager.get_capabilities()
|
|
371
|
+
if cached_capabilities is not None:
|
|
372
|
+
return cached_capabilities
|
|
373
|
+
|
|
374
|
+
self.logger.debug("Generating agent capabilities (cache miss)")
|
|
375
|
+
|
|
376
|
+
try:
|
|
377
|
+
# Discover local JSON templates
|
|
378
|
+
local_agents = self._discover_local_json_templates()
|
|
379
|
+
|
|
380
|
+
# Get deployed agents from .claude/agents/
|
|
381
|
+
deployed_agents = []
|
|
382
|
+
agents_dirs = [
|
|
383
|
+
Path.cwd() / ".claude" / "agents",
|
|
384
|
+
Path.home() / ".claude" / "agents",
|
|
385
|
+
]
|
|
386
|
+
|
|
387
|
+
for agents_dir in agents_dirs:
|
|
388
|
+
if agents_dir.exists():
|
|
389
|
+
for agent_file in agents_dir.glob("*.md"):
|
|
390
|
+
if not agent_file.name.startswith("."):
|
|
391
|
+
agent_data = self._parse_agent_metadata(agent_file)
|
|
392
|
+
if agent_data:
|
|
393
|
+
deployed_agents.append(agent_data)
|
|
394
|
+
|
|
395
|
+
# Generate capabilities section
|
|
396
|
+
section = self.capability_generator.generate_capabilities_section(
|
|
397
|
+
deployed_agents, local_agents
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
# Cache the result
|
|
401
|
+
self._cache_manager.set_capabilities(section)
|
|
402
|
+
self.logger.debug(f"Cached agent capabilities ({len(section)} chars)")
|
|
403
|
+
|
|
404
|
+
return section
|
|
405
|
+
|
|
406
|
+
except Exception as e:
|
|
407
|
+
self.logger.warning(f"Could not generate agent capabilities: {e}")
|
|
408
|
+
fallback = self.content_formatter.get_fallback_capabilities()
|
|
409
|
+
self._cache_manager.set_capabilities(fallback)
|
|
410
|
+
return fallback
|
|
411
|
+
|
|
412
|
+
# === Output Style Management ===
|
|
413
|
+
|
|
414
|
+
def _initialize_output_style(self) -> None:
|
|
415
|
+
"""Initialize output style management."""
|
|
416
|
+
try:
|
|
417
|
+
from claude_mpm.core.output_style_manager import OutputStyleManager
|
|
418
|
+
|
|
419
|
+
self.output_style_manager = OutputStyleManager()
|
|
420
|
+
self._log_output_style_status()
|
|
421
|
+
|
|
422
|
+
# Extract and save output style content
|
|
423
|
+
output_style_content = (
|
|
424
|
+
self.output_style_manager.extract_output_style_content(
|
|
425
|
+
framework_loader=self
|
|
426
|
+
)
|
|
427
|
+
)
|
|
428
|
+
self.output_style_manager.save_output_style(output_style_content)
|
|
429
|
+
|
|
430
|
+
# Deploy to Claude Code if supported
|
|
431
|
+
deployed = self.output_style_manager.deploy_output_style(
|
|
432
|
+
output_style_content
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
if deployed:
|
|
436
|
+
self.logger.info("✅ Output style deployed to Claude Code >= 1.0.83")
|
|
437
|
+
else:
|
|
438
|
+
self.logger.info("📝 Output style will be injected into instructions")
|
|
439
|
+
|
|
440
|
+
except Exception as e:
|
|
441
|
+
self.logger.warning(f"❌ Failed to initialize output style manager: {e}")
|
|
442
|
+
|
|
443
|
+
def _log_output_style_status(self) -> None:
|
|
444
|
+
"""Log output style status information."""
|
|
445
|
+
if not self.output_style_manager:
|
|
446
|
+
return
|
|
447
|
+
|
|
448
|
+
claude_version = self.output_style_manager.claude_version
|
|
449
|
+
if claude_version:
|
|
450
|
+
self.logger.info(f"Claude Code version detected: {claude_version}")
|
|
451
|
+
|
|
452
|
+
if self.output_style_manager.supports_output_styles():
|
|
453
|
+
self.logger.info("✅ Claude Code supports output styles (>= 1.0.83)")
|
|
454
|
+
output_style_path = self.output_style_manager.output_style_path
|
|
455
|
+
if output_style_path.exists():
|
|
456
|
+
self.logger.info(
|
|
457
|
+
f"📁 Output style file exists: {output_style_path}"
|
|
458
|
+
)
|
|
459
|
+
else:
|
|
460
|
+
self.logger.info(
|
|
461
|
+
f"📝 Output style will be created at: {output_style_path}"
|
|
462
|
+
)
|
|
463
|
+
else:
|
|
464
|
+
self.logger.info(
|
|
465
|
+
f"⚠️ Claude Code {claude_version} does not support output styles"
|
|
466
|
+
)
|
|
467
|
+
self.logger.info(
|
|
468
|
+
"📝 Output style will be injected into framework instructions"
|
|
469
|
+
)
|
|
470
|
+
else:
|
|
471
|
+
self.logger.info("⚠️ Claude Code not detected or version unknown")
|
|
472
|
+
self.logger.info("📝 Output style will be injected as fallback")
|
|
473
|
+
|
|
474
|
+
# === Logging Methods ===
|
|
475
|
+
|
|
476
|
+
def _log_system_prompt(self) -> None:
|
|
477
|
+
"""Log the system prompt if LogManager is available."""
|
|
478
|
+
try:
|
|
479
|
+
from .log_manager import get_log_manager
|
|
480
|
+
|
|
481
|
+
log_manager = get_log_manager()
|
|
482
|
+
except ImportError:
|
|
483
|
+
return
|
|
484
|
+
|
|
485
|
+
try:
|
|
486
|
+
# Get or create event loop
|
|
487
|
+
try:
|
|
488
|
+
loop = asyncio.get_running_loop()
|
|
489
|
+
except RuntimeError:
|
|
490
|
+
loop = asyncio.new_event_loop()
|
|
491
|
+
asyncio.set_event_loop(loop)
|
|
492
|
+
|
|
493
|
+
# Prepare metadata
|
|
494
|
+
metadata = {
|
|
495
|
+
"framework_version": self.framework_version,
|
|
496
|
+
"framework_loaded": self.framework_content.get("loaded", False),
|
|
497
|
+
"session_id": os.environ.get("CLAUDE_SESSION_ID", "unknown"),
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
# Log the prompt asynchronously
|
|
501
|
+
instructions = (
|
|
502
|
+
self._format_full_framework()
|
|
503
|
+
if self.framework_content["loaded"]
|
|
504
|
+
else self._format_minimal_framework()
|
|
505
|
+
)
|
|
506
|
+
metadata["instructions_length"] = len(instructions)
|
|
507
|
+
|
|
508
|
+
if loop.is_running():
|
|
509
|
+
_task = asyncio.create_task(
|
|
510
|
+
log_manager.log_prompt("system_prompt", instructions, metadata)
|
|
511
|
+
) # Fire-and-forget logging
|
|
512
|
+
else:
|
|
513
|
+
loop.run_until_complete(
|
|
514
|
+
log_manager.log_prompt("system_prompt", instructions, metadata)
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
self.logger.debug("System prompt logged to prompts directory")
|
|
518
|
+
except Exception as e:
|
|
519
|
+
self.logger.debug(f"Could not log system prompt: {e}")
|
|
520
|
+
|
|
521
|
+
# === Agent Registry Methods (backward compatibility) ===
|
|
522
|
+
|
|
523
|
+
def get_agent_list(self) -> List[str]:
|
|
447
524
|
"""Get list of available agents."""
|
|
448
|
-
# First try agent registry
|
|
449
525
|
if self.agent_registry:
|
|
450
526
|
agents = self.agent_registry.list_agents()
|
|
451
527
|
if agents:
|
|
452
528
|
return list(agents.keys())
|
|
453
|
-
|
|
454
|
-
# Fallback to loaded content
|
|
455
529
|
return list(self.framework_content["agents"].keys())
|
|
456
|
-
|
|
530
|
+
|
|
457
531
|
def get_agent_definition(self, agent_name: str) -> Optional[str]:
|
|
458
532
|
"""Get specific agent definition."""
|
|
459
|
-
# First try agent registry
|
|
460
533
|
if self.agent_registry:
|
|
461
534
|
definition = self.agent_registry.get_agent_definition(agent_name)
|
|
462
535
|
if definition:
|
|
463
536
|
return definition
|
|
464
|
-
|
|
465
|
-
# Fallback to loaded content
|
|
466
537
|
return self.framework_content["agents"].get(agent_name)
|
|
467
|
-
|
|
468
|
-
def get_agent_hierarchy(self) -> Dict[str,
|
|
538
|
+
|
|
539
|
+
def get_agent_hierarchy(self) -> Dict[str, List]:
|
|
469
540
|
"""Get agent hierarchy from registry."""
|
|
470
541
|
if self.agent_registry:
|
|
471
542
|
return self.agent_registry.get_agent_hierarchy()
|
|
472
|
-
return {
|
|
543
|
+
return {"project": [], "user": [], "system": []}
|