claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/BUILD_NUMBER +1 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +94 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2501 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +3253 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1398 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +298 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +31 -0
- claude_mpm/cli/interactive/agent_wizard.py +1927 -0
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +649 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1578 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +133 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +278 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +491 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +612 -0
- claude_mpm/core/unified_paths.py +958 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +201 -107
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1205 -0
- claude_mpm/services/agents/startup_sync.py +262 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +711 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
- claude_mpm/services/skills/selective_skill_deployer.py +743 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1189 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +844 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.85.dist-info/METADATA +1023 -0
- claude_mpm-5.4.85.dist-info/RECORD +980 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,969 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Unified Agent Registry System for Claude MPM
|
|
4
|
+
============================================
|
|
5
|
+
|
|
6
|
+
This module consolidates all agent registry functionality from the duplicate modules:
|
|
7
|
+
- core/agent_registry.py (AgentRegistryAdapter and legacy functions)
|
|
8
|
+
- services/agents/registry/agent_registry.py (Full-featured AgentRegistry)
|
|
9
|
+
- agents/core/agent_registry.py (Core AgentRegistry with memory integration)
|
|
10
|
+
|
|
11
|
+
Design Principles:
|
|
12
|
+
- Single source of truth for agent discovery and management
|
|
13
|
+
- Consistent API across all agent operations
|
|
14
|
+
- Hierarchical tier system (PROJECT > USER > SYSTEM)
|
|
15
|
+
- Memory-aware agent creation
|
|
16
|
+
- Efficient caching with smart invalidation
|
|
17
|
+
- Comprehensive metadata management
|
|
18
|
+
- Backward compatibility during migration
|
|
19
|
+
|
|
20
|
+
Architecture:
|
|
21
|
+
- UnifiedAgentRegistry: Main registry class
|
|
22
|
+
- AgentMetadata: Standardized agent metadata model
|
|
23
|
+
- AgentTier: Hierarchical precedence system
|
|
24
|
+
- AgentType: Agent classification system
|
|
25
|
+
- Discovery engine with tier-based precedence
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
import contextlib
|
|
29
|
+
import json
|
|
30
|
+
import time
|
|
31
|
+
from dataclasses import asdict, dataclass
|
|
32
|
+
from datetime import datetime, timezone
|
|
33
|
+
from enum import Enum
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
from typing import Any, Dict, List, Optional, Set, Union
|
|
36
|
+
|
|
37
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
38
|
+
|
|
39
|
+
from .unified_paths import get_path_manager
|
|
40
|
+
|
|
41
|
+
logger = get_logger(__name__)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class AgentTier(Enum):
|
|
45
|
+
"""Agent tier hierarchy for precedence resolution."""
|
|
46
|
+
|
|
47
|
+
PROJECT = "project" # Highest precedence
|
|
48
|
+
USER = "user" # Medium precedence
|
|
49
|
+
SYSTEM = "system" # Lowest precedence
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class AgentType(Enum):
|
|
53
|
+
"""Agent type classification."""
|
|
54
|
+
|
|
55
|
+
CORE = "core" # Core framework agents
|
|
56
|
+
SPECIALIZED = "specialized" # Specialized domain agents
|
|
57
|
+
USER_DEFINED = "user_defined" # User-created agents
|
|
58
|
+
PROJECT = "project" # Project-specific agents
|
|
59
|
+
MEMORY_AWARE = "memory_aware" # Memory-enhanced agents
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class AgentFormat(Enum):
|
|
63
|
+
"""Supported agent file formats."""
|
|
64
|
+
|
|
65
|
+
MARKDOWN = "markdown"
|
|
66
|
+
JSON = "json"
|
|
67
|
+
YAML = "yaml"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass
|
|
71
|
+
class AgentMetadata:
|
|
72
|
+
"""Standardized agent metadata model."""
|
|
73
|
+
|
|
74
|
+
name: str
|
|
75
|
+
agent_type: AgentType
|
|
76
|
+
tier: AgentTier
|
|
77
|
+
path: str
|
|
78
|
+
format: AgentFormat
|
|
79
|
+
last_modified: float
|
|
80
|
+
description: str = ""
|
|
81
|
+
specializations: List[str] = None
|
|
82
|
+
memory_files: List[str] = None
|
|
83
|
+
dependencies: List[str] = None
|
|
84
|
+
version: str = "1.0.0"
|
|
85
|
+
author: str = ""
|
|
86
|
+
tags: List[str] = None
|
|
87
|
+
# NEW: Collection-based identification fields
|
|
88
|
+
collection_id: Optional[str] = None # Format: owner/repo-name
|
|
89
|
+
source_path: Optional[str] = None # Relative path in repo
|
|
90
|
+
canonical_id: Optional[str] = (
|
|
91
|
+
None # Format: collection_id:agent_id or legacy:filename
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def __post_init__(self):
|
|
95
|
+
"""Initialize default values for mutable fields."""
|
|
96
|
+
if self.specializations is None:
|
|
97
|
+
self.specializations = []
|
|
98
|
+
if self.memory_files is None:
|
|
99
|
+
self.memory_files = []
|
|
100
|
+
if self.dependencies is None:
|
|
101
|
+
self.dependencies = []
|
|
102
|
+
if self.tags is None:
|
|
103
|
+
self.tags = []
|
|
104
|
+
|
|
105
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
106
|
+
"""Convert to dictionary representation."""
|
|
107
|
+
data = asdict(self)
|
|
108
|
+
data["agent_type"] = self.agent_type.value
|
|
109
|
+
data["tier"] = self.tier.value
|
|
110
|
+
data["format"] = self.format.value
|
|
111
|
+
return data
|
|
112
|
+
|
|
113
|
+
@classmethod
|
|
114
|
+
def from_dict(cls, data: Dict[str, Any]) -> "AgentMetadata":
|
|
115
|
+
"""Create from dictionary representation."""
|
|
116
|
+
data["agent_type"] = AgentType(data["agent_type"])
|
|
117
|
+
data["tier"] = AgentTier(data["tier"])
|
|
118
|
+
data["format"] = AgentFormat(data["format"])
|
|
119
|
+
return cls(**data)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class UnifiedAgentRegistry:
|
|
123
|
+
"""
|
|
124
|
+
Unified agent registry system that consolidates all agent-related functionality.
|
|
125
|
+
|
|
126
|
+
This class provides a single, authoritative interface for all agent operations
|
|
127
|
+
in Claude MPM, replacing the multiple duplicate agent registry modules.
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
def __init__(self, cache_enabled: bool = True, cache_ttl: int = 3600):
|
|
131
|
+
"""Initialize the unified agent registry."""
|
|
132
|
+
self.path_manager = get_path_manager()
|
|
133
|
+
|
|
134
|
+
# Registry storage
|
|
135
|
+
self.registry: Dict[str, AgentMetadata] = {}
|
|
136
|
+
self.discovery_paths: List[Path] = []
|
|
137
|
+
self.discovered_files: Set[Path] = set()
|
|
138
|
+
|
|
139
|
+
# Cache configuration
|
|
140
|
+
self.cache_enabled = cache_enabled
|
|
141
|
+
self.cache_ttl = cache_ttl
|
|
142
|
+
self.cache_prefix = "unified_agent_registry"
|
|
143
|
+
|
|
144
|
+
# Discovery configuration
|
|
145
|
+
self.file_extensions = {".md", ".json", ".yaml", ".yml"}
|
|
146
|
+
self.ignore_patterns = {
|
|
147
|
+
"__pycache__",
|
|
148
|
+
".git",
|
|
149
|
+
"node_modules",
|
|
150
|
+
".pytest_cache",
|
|
151
|
+
"backup",
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
# Statistics
|
|
155
|
+
self.discovery_stats = {
|
|
156
|
+
"last_discovery": None,
|
|
157
|
+
"total_discovered": 0,
|
|
158
|
+
"cache_hits": 0,
|
|
159
|
+
"cache_misses": 0,
|
|
160
|
+
"discovery_duration": 0.0,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
# Setup discovery paths
|
|
164
|
+
self._setup_discovery_paths()
|
|
165
|
+
|
|
166
|
+
logger.info(
|
|
167
|
+
f"UnifiedAgentRegistry initialized with cache={'enabled' if cache_enabled else 'disabled'}"
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
def _setup_discovery_paths(self) -> None:
|
|
171
|
+
"""Setup standard discovery paths for agent files."""
|
|
172
|
+
# Project-level agents (highest priority)
|
|
173
|
+
project_path = self.path_manager.get_project_agents_dir()
|
|
174
|
+
if project_path.exists():
|
|
175
|
+
self.discovery_paths.append(project_path)
|
|
176
|
+
|
|
177
|
+
# NOTE: .claude-mpm/agents/ is deprecated in the simplified architecture
|
|
178
|
+
# Source agents come from ~/.claude-mpm/cache/agents/
|
|
179
|
+
# Deployed agents go to .claude/agents/
|
|
180
|
+
|
|
181
|
+
# User-level agents (deprecated in simplified architecture)
|
|
182
|
+
# Keeping for backward compatibility but not actively used
|
|
183
|
+
user_path = self.path_manager.get_user_agents_dir()
|
|
184
|
+
if user_path.exists():
|
|
185
|
+
self.discovery_paths.append(user_path)
|
|
186
|
+
|
|
187
|
+
# System-level agents (includes templates as a subdirectory)
|
|
188
|
+
system_path = self.path_manager.get_system_agents_dir()
|
|
189
|
+
if system_path.exists():
|
|
190
|
+
self.discovery_paths.append(system_path)
|
|
191
|
+
|
|
192
|
+
# NOTE: Templates directory is NOT added separately because:
|
|
193
|
+
# - templates_path = system_path / "templates"
|
|
194
|
+
# - The rglob("*") in _discover_path will already find templates
|
|
195
|
+
# - Adding it separately causes duplicate discovery
|
|
196
|
+
|
|
197
|
+
logger.debug(
|
|
198
|
+
f"Discovery paths configured: {[str(p) for p in self.discovery_paths]}"
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
def discover_agents(self, force_refresh: bool = False) -> Dict[str, AgentMetadata]:
|
|
202
|
+
"""
|
|
203
|
+
Discover all agents from configured paths with tier precedence.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
force_refresh: Force re-discovery even if cache is valid
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
Dictionary mapping agent names to their metadata
|
|
210
|
+
"""
|
|
211
|
+
start_time = time.time()
|
|
212
|
+
|
|
213
|
+
# Check cache first (if enabled and not forcing refresh)
|
|
214
|
+
if self.cache_enabled and not force_refresh and self._is_cache_valid():
|
|
215
|
+
self.discovery_stats["cache_hits"] += 1
|
|
216
|
+
logger.debug("Using cached agent registry")
|
|
217
|
+
return self.registry
|
|
218
|
+
|
|
219
|
+
self.discovery_stats["cache_misses"] += 1
|
|
220
|
+
|
|
221
|
+
# Clear existing registry and discovered files
|
|
222
|
+
self.registry.clear()
|
|
223
|
+
self.discovered_files.clear()
|
|
224
|
+
|
|
225
|
+
# Discover agents from all paths
|
|
226
|
+
for discovery_path in self.discovery_paths:
|
|
227
|
+
tier = self._determine_tier(discovery_path)
|
|
228
|
+
self._discover_path(discovery_path, tier)
|
|
229
|
+
|
|
230
|
+
# Handle tier precedence
|
|
231
|
+
self._apply_tier_precedence()
|
|
232
|
+
|
|
233
|
+
# Discover and integrate memory files
|
|
234
|
+
self._discover_memory_integration()
|
|
235
|
+
|
|
236
|
+
# Cache the results
|
|
237
|
+
if self.cache_enabled:
|
|
238
|
+
self._cache_registry()
|
|
239
|
+
|
|
240
|
+
# Update statistics
|
|
241
|
+
self.discovery_stats["last_discovery"] = time.time()
|
|
242
|
+
self.discovery_stats["total_discovered"] = len(self.registry)
|
|
243
|
+
self.discovery_stats["discovery_duration"] = time.time() - start_time
|
|
244
|
+
|
|
245
|
+
logger.info(
|
|
246
|
+
f"Discovered {len(self.registry)} agents in {self.discovery_stats['discovery_duration']:.2f}s"
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
return self.registry
|
|
250
|
+
|
|
251
|
+
def _discover_path(self, path: Path, tier: AgentTier) -> None:
|
|
252
|
+
"""Discover agents in a specific path."""
|
|
253
|
+
if not path.exists():
|
|
254
|
+
return
|
|
255
|
+
|
|
256
|
+
for file_path in path.rglob("*"):
|
|
257
|
+
# Skip directories and ignored patterns
|
|
258
|
+
if file_path.is_dir():
|
|
259
|
+
continue
|
|
260
|
+
|
|
261
|
+
if any(pattern in str(file_path) for pattern in self.ignore_patterns):
|
|
262
|
+
continue
|
|
263
|
+
|
|
264
|
+
# Check file extension
|
|
265
|
+
if file_path.suffix not in self.file_extensions:
|
|
266
|
+
continue
|
|
267
|
+
|
|
268
|
+
# Extract agent name
|
|
269
|
+
agent_name = self._extract_agent_name(file_path)
|
|
270
|
+
if not agent_name:
|
|
271
|
+
continue
|
|
272
|
+
|
|
273
|
+
# Create agent metadata
|
|
274
|
+
try:
|
|
275
|
+
metadata = self._create_agent_metadata(file_path, agent_name, tier)
|
|
276
|
+
if metadata:
|
|
277
|
+
# Store all discovered agents temporarily for tier precedence
|
|
278
|
+
# Use a unique key that includes tier to prevent overwrites
|
|
279
|
+
registry_key = f"{agent_name}_{tier.value}"
|
|
280
|
+
self.registry[registry_key] = metadata
|
|
281
|
+
self.discovered_files.add(file_path)
|
|
282
|
+
logger.debug(
|
|
283
|
+
f"Discovered agent: {agent_name} ({tier.value}) at {file_path}"
|
|
284
|
+
)
|
|
285
|
+
except Exception as e:
|
|
286
|
+
logger.warning(f"Failed to process agent file {file_path}: {e}")
|
|
287
|
+
|
|
288
|
+
def _extract_agent_name(self, file_path: Path) -> Optional[str]:
|
|
289
|
+
"""Extract agent name from file path."""
|
|
290
|
+
# Remove extension and use filename as agent name
|
|
291
|
+
name = file_path.stem
|
|
292
|
+
|
|
293
|
+
# Skip certain files and non-agent templates
|
|
294
|
+
skip_files = {
|
|
295
|
+
"README",
|
|
296
|
+
"INSTRUCTIONS",
|
|
297
|
+
"template",
|
|
298
|
+
"example",
|
|
299
|
+
"base_agent",
|
|
300
|
+
"base_agent_template",
|
|
301
|
+
"agent_template",
|
|
302
|
+
"agent_schema",
|
|
303
|
+
"base_pm",
|
|
304
|
+
"workflow",
|
|
305
|
+
"output_style",
|
|
306
|
+
"memory",
|
|
307
|
+
"optimization_report",
|
|
308
|
+
"vercel_ops_instructions",
|
|
309
|
+
"agent-template",
|
|
310
|
+
"agent-schema", # Also handle hyphenated versions
|
|
311
|
+
}
|
|
312
|
+
# Case-insensitive comparison
|
|
313
|
+
if name.replace("-", "_").upper() in {
|
|
314
|
+
s.replace("-", "_").upper() for s in skip_files
|
|
315
|
+
}:
|
|
316
|
+
return None
|
|
317
|
+
|
|
318
|
+
# Normalize name
|
|
319
|
+
return name.lower().replace("-", "_").replace(" ", "_")
|
|
320
|
+
|
|
321
|
+
def _create_agent_metadata(
|
|
322
|
+
self, file_path: Path, agent_name: str, tier: AgentTier
|
|
323
|
+
) -> Optional[AgentMetadata]:
|
|
324
|
+
"""Create agent metadata from file."""
|
|
325
|
+
try:
|
|
326
|
+
# Determine format
|
|
327
|
+
format_map = {
|
|
328
|
+
".md": AgentFormat.MARKDOWN,
|
|
329
|
+
".json": AgentFormat.JSON,
|
|
330
|
+
".yaml": AgentFormat.YAML,
|
|
331
|
+
".yml": AgentFormat.YAML,
|
|
332
|
+
}
|
|
333
|
+
agent_format = format_map.get(file_path.suffix, AgentFormat.MARKDOWN)
|
|
334
|
+
|
|
335
|
+
# Determine agent type
|
|
336
|
+
agent_type = self._determine_agent_type(file_path, tier)
|
|
337
|
+
|
|
338
|
+
# Extract metadata from file content
|
|
339
|
+
description, specializations = self._extract_file_metadata(
|
|
340
|
+
file_path, agent_format
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
# For JSON files, extract additional metadata
|
|
344
|
+
version = "1.0.0"
|
|
345
|
+
author = ""
|
|
346
|
+
tags = []
|
|
347
|
+
|
|
348
|
+
if agent_format == AgentFormat.JSON:
|
|
349
|
+
try:
|
|
350
|
+
content = file_path.read_text(encoding="utf-8")
|
|
351
|
+
data = json.loads(content)
|
|
352
|
+
|
|
353
|
+
# Extract version
|
|
354
|
+
version = data.get("agent_version", data.get("version", "1.0.0"))
|
|
355
|
+
|
|
356
|
+
# Extract author (use project name for local agents)
|
|
357
|
+
author = data.get("author", "")
|
|
358
|
+
if not author and ".claude-mpm" in str(file_path):
|
|
359
|
+
# For local agents, use project directory name as author
|
|
360
|
+
project_root = file_path
|
|
361
|
+
while project_root.parent != project_root:
|
|
362
|
+
if (project_root / ".claude-mpm").exists():
|
|
363
|
+
author = project_root.name
|
|
364
|
+
break
|
|
365
|
+
project_root = project_root.parent
|
|
366
|
+
|
|
367
|
+
# Extract tags (handle both list and comma-separated string formats)
|
|
368
|
+
if "metadata" in data:
|
|
369
|
+
tags_raw = data["metadata"].get("tags", [])
|
|
370
|
+
if isinstance(tags_raw, str):
|
|
371
|
+
tags = [
|
|
372
|
+
tag.strip()
|
|
373
|
+
for tag in tags_raw.split(",")
|
|
374
|
+
if tag.strip()
|
|
375
|
+
]
|
|
376
|
+
else:
|
|
377
|
+
tags = tags_raw if isinstance(tags_raw, list) else []
|
|
378
|
+
|
|
379
|
+
except Exception as e:
|
|
380
|
+
logger.debug(
|
|
381
|
+
f"Could not extract extra JSON metadata from {file_path}: {e}"
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
metadata = AgentMetadata(
|
|
385
|
+
name=agent_name,
|
|
386
|
+
agent_type=agent_type,
|
|
387
|
+
tier=tier,
|
|
388
|
+
path=str(file_path),
|
|
389
|
+
format=agent_format,
|
|
390
|
+
last_modified=file_path.stat().st_mtime,
|
|
391
|
+
description=description,
|
|
392
|
+
specializations=specializations,
|
|
393
|
+
version=version,
|
|
394
|
+
author=author,
|
|
395
|
+
tags=tags,
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
# Set higher priority for local agents
|
|
399
|
+
if ".claude-mpm" in str(file_path):
|
|
400
|
+
if tier == AgentTier.PROJECT:
|
|
401
|
+
# Highest priority for project-local agents
|
|
402
|
+
metadata.tags.append("local")
|
|
403
|
+
metadata.tags.append("project")
|
|
404
|
+
elif tier == AgentTier.USER:
|
|
405
|
+
# High priority for user-local agents
|
|
406
|
+
metadata.tags.append("local")
|
|
407
|
+
metadata.tags.append("user")
|
|
408
|
+
|
|
409
|
+
return metadata
|
|
410
|
+
|
|
411
|
+
except Exception as e:
|
|
412
|
+
logger.error(f"Failed to create metadata for {file_path}: {e}")
|
|
413
|
+
return None
|
|
414
|
+
|
|
415
|
+
def _determine_tier(self, path: Path) -> AgentTier:
|
|
416
|
+
"""Determine agent tier based on path."""
|
|
417
|
+
path_str = str(path)
|
|
418
|
+
|
|
419
|
+
if (
|
|
420
|
+
"project" in path_str
|
|
421
|
+
or str(self.path_manager.get_project_agents_dir()) in path_str
|
|
422
|
+
):
|
|
423
|
+
return AgentTier.PROJECT
|
|
424
|
+
if (
|
|
425
|
+
"user" in path_str
|
|
426
|
+
or str(self.path_manager.get_user_agents_dir()) in path_str
|
|
427
|
+
):
|
|
428
|
+
return AgentTier.USER
|
|
429
|
+
return AgentTier.SYSTEM
|
|
430
|
+
|
|
431
|
+
def _determine_agent_type(self, file_path: Path, tier: AgentTier) -> AgentType:
|
|
432
|
+
"""Determine agent type based on file path and tier."""
|
|
433
|
+
path_str = str(file_path).lower()
|
|
434
|
+
|
|
435
|
+
# Project-specific agents
|
|
436
|
+
if tier == AgentTier.PROJECT:
|
|
437
|
+
return AgentType.PROJECT
|
|
438
|
+
|
|
439
|
+
# User-defined agents
|
|
440
|
+
if tier == AgentTier.USER:
|
|
441
|
+
return AgentType.USER_DEFINED
|
|
442
|
+
|
|
443
|
+
# Core framework agents
|
|
444
|
+
if "templates" in path_str or "core" in path_str:
|
|
445
|
+
return AgentType.CORE
|
|
446
|
+
|
|
447
|
+
# Specialized agents
|
|
448
|
+
return AgentType.SPECIALIZED
|
|
449
|
+
|
|
450
|
+
def _extract_file_metadata(
|
|
451
|
+
self, file_path: Path, agent_format: AgentFormat
|
|
452
|
+
) -> tuple[str, List[str]]:
|
|
453
|
+
"""Extract description and specializations from agent file."""
|
|
454
|
+
try:
|
|
455
|
+
content = file_path.read_text(encoding="utf-8")
|
|
456
|
+
|
|
457
|
+
if agent_format == AgentFormat.JSON:
|
|
458
|
+
data = json.loads(content)
|
|
459
|
+
|
|
460
|
+
# Ensure data is a dictionary, not a list
|
|
461
|
+
if not isinstance(data, dict):
|
|
462
|
+
logger.warning(
|
|
463
|
+
f"Invalid JSON structure in {file_path}: expected object, got {type(data).__name__}"
|
|
464
|
+
)
|
|
465
|
+
return "", []
|
|
466
|
+
|
|
467
|
+
# Handle local agent JSON templates with metadata structure
|
|
468
|
+
if "metadata" in data:
|
|
469
|
+
metadata = data["metadata"]
|
|
470
|
+
description = metadata.get(
|
|
471
|
+
"description", data.get("description", "")
|
|
472
|
+
)
|
|
473
|
+
specializations = metadata.get(
|
|
474
|
+
"specializations", data.get("specializations", [])
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
# Extract tags as specializations if present (handle both formats)
|
|
478
|
+
tags_raw = metadata.get("tags", [])
|
|
479
|
+
if isinstance(tags_raw, str):
|
|
480
|
+
tags = [
|
|
481
|
+
tag.strip() for tag in tags_raw.split(",") if tag.strip()
|
|
482
|
+
]
|
|
483
|
+
else:
|
|
484
|
+
tags = tags_raw if isinstance(tags_raw, list) else []
|
|
485
|
+
if tags and not specializations:
|
|
486
|
+
specializations = tags
|
|
487
|
+
else:
|
|
488
|
+
# Fallback to direct fields
|
|
489
|
+
description = data.get("description", "")
|
|
490
|
+
specializations = data.get("specializations", [])
|
|
491
|
+
|
|
492
|
+
elif agent_format in [AgentFormat.YAML, AgentFormat.YAML]:
|
|
493
|
+
try:
|
|
494
|
+
import yaml
|
|
495
|
+
|
|
496
|
+
data = yaml.safe_load(content)
|
|
497
|
+
description = data.get("description", "")
|
|
498
|
+
specializations = data.get("specializations", [])
|
|
499
|
+
except ImportError:
|
|
500
|
+
# Fallback if yaml not available
|
|
501
|
+
description = ""
|
|
502
|
+
specializations = []
|
|
503
|
+
else: # Markdown
|
|
504
|
+
# Extract from frontmatter or content
|
|
505
|
+
description = self._extract_markdown_description(content)
|
|
506
|
+
specializations = self._extract_markdown_specializations(content)
|
|
507
|
+
|
|
508
|
+
return description, specializations
|
|
509
|
+
|
|
510
|
+
except Exception as e:
|
|
511
|
+
logger.warning(f"Failed to extract metadata from {file_path}: {e}")
|
|
512
|
+
return "", []
|
|
513
|
+
|
|
514
|
+
def _extract_markdown_description(self, content: str) -> str:
|
|
515
|
+
"""Extract description from markdown content."""
|
|
516
|
+
lines = content.split("\n")
|
|
517
|
+
|
|
518
|
+
# Look for frontmatter
|
|
519
|
+
if lines and lines[0].strip() == "---":
|
|
520
|
+
for _i, line in enumerate(lines[1:], 1):
|
|
521
|
+
if line.strip() == "---":
|
|
522
|
+
break
|
|
523
|
+
if line.strip().startswith("description:"):
|
|
524
|
+
return line.strip().split(":", 1)[1].strip().strip("\"'")
|
|
525
|
+
|
|
526
|
+
# Look for first paragraph
|
|
527
|
+
for line in lines:
|
|
528
|
+
line = line.strip()
|
|
529
|
+
if line and not line.startswith("#") and not line.startswith("---"):
|
|
530
|
+
return line
|
|
531
|
+
|
|
532
|
+
return ""
|
|
533
|
+
|
|
534
|
+
def _extract_markdown_specializations(self, content: str) -> List[str]:
|
|
535
|
+
"""Extract specializations from markdown content."""
|
|
536
|
+
specializations = []
|
|
537
|
+
|
|
538
|
+
# Look for frontmatter
|
|
539
|
+
lines = content.split("\n")
|
|
540
|
+
if lines and lines[0].strip() == "---":
|
|
541
|
+
for _i, line in enumerate(lines[1:], 1):
|
|
542
|
+
if line.strip() == "---":
|
|
543
|
+
break
|
|
544
|
+
if line.startswith("specializations:"):
|
|
545
|
+
# Parse YAML list
|
|
546
|
+
spec_content = line.split(":", 1)[1].strip()
|
|
547
|
+
if spec_content.startswith("[") and spec_content.endswith("]"):
|
|
548
|
+
# JSON-style list
|
|
549
|
+
with contextlib.suppress(Exception):
|
|
550
|
+
specializations = json.loads(spec_content)
|
|
551
|
+
|
|
552
|
+
return specializations
|
|
553
|
+
|
|
554
|
+
def _apply_tier_precedence(self) -> None:
|
|
555
|
+
"""Apply tier precedence rules to resolve conflicts."""
|
|
556
|
+
# Group agents by their actual name (without tier suffix)
|
|
557
|
+
agent_groups = {}
|
|
558
|
+
for _registry_key, metadata in self.registry.items():
|
|
559
|
+
# Extract the actual agent name (registry_key is "name_tier")
|
|
560
|
+
agent_name = metadata.name # Use the actual name from metadata
|
|
561
|
+
if agent_name not in agent_groups:
|
|
562
|
+
agent_groups[agent_name] = []
|
|
563
|
+
agent_groups[agent_name].append(metadata)
|
|
564
|
+
|
|
565
|
+
# Resolve conflicts using tier precedence
|
|
566
|
+
resolved_registry = {}
|
|
567
|
+
tier_order = [AgentTier.PROJECT, AgentTier.USER, AgentTier.SYSTEM]
|
|
568
|
+
|
|
569
|
+
for name, agents in agent_groups.items():
|
|
570
|
+
if len(agents) == 1:
|
|
571
|
+
resolved_registry[name] = agents[0]
|
|
572
|
+
else:
|
|
573
|
+
# Find highest precedence agent
|
|
574
|
+
for tier in tier_order:
|
|
575
|
+
for agent in agents:
|
|
576
|
+
if agent.tier == tier:
|
|
577
|
+
resolved_registry[name] = agent
|
|
578
|
+
logger.debug(
|
|
579
|
+
f"Resolved conflict for {name}: using {tier.value} tier"
|
|
580
|
+
)
|
|
581
|
+
break
|
|
582
|
+
if name in resolved_registry:
|
|
583
|
+
break
|
|
584
|
+
|
|
585
|
+
self.registry = resolved_registry
|
|
586
|
+
|
|
587
|
+
def _discover_memory_integration(self) -> None:
|
|
588
|
+
"""Discover and integrate memory files with agents."""
|
|
589
|
+
memories_dir = self.path_manager.get_memories_dir("project")
|
|
590
|
+
if not memories_dir.exists():
|
|
591
|
+
return
|
|
592
|
+
|
|
593
|
+
for memory_file in memories_dir.glob("*.md"):
|
|
594
|
+
memory_name = memory_file.stem
|
|
595
|
+
|
|
596
|
+
# Find matching agent
|
|
597
|
+
for agent_name, metadata in self.registry.items():
|
|
598
|
+
if agent_name == memory_name or memory_name in agent_name:
|
|
599
|
+
metadata.memory_files.append(str(memory_file))
|
|
600
|
+
metadata.agent_type = AgentType.MEMORY_AWARE
|
|
601
|
+
logger.debug(
|
|
602
|
+
f"Integrated memory file {memory_file} with agent {agent_name}"
|
|
603
|
+
)
|
|
604
|
+
|
|
605
|
+
def _is_cache_valid(self) -> bool:
|
|
606
|
+
"""Check if the current cache is still valid."""
|
|
607
|
+
if not self.discovery_stats["last_discovery"]:
|
|
608
|
+
return False
|
|
609
|
+
|
|
610
|
+
# Check if cache has expired
|
|
611
|
+
cache_age = time.time() - self.discovery_stats["last_discovery"]
|
|
612
|
+
if cache_age > self.cache_ttl:
|
|
613
|
+
return False
|
|
614
|
+
|
|
615
|
+
# Check if any discovered files have been modified
|
|
616
|
+
for file_path in self.discovered_files:
|
|
617
|
+
if file_path.exists():
|
|
618
|
+
if file_path.stat().st_mtime > self.discovery_stats["last_discovery"]:
|
|
619
|
+
return False
|
|
620
|
+
else:
|
|
621
|
+
# File was deleted
|
|
622
|
+
return False
|
|
623
|
+
|
|
624
|
+
return True
|
|
625
|
+
|
|
626
|
+
def _cache_registry(self) -> None:
|
|
627
|
+
"""Cache the current registry state."""
|
|
628
|
+
# For now, we just store in memory
|
|
629
|
+
# In a full implementation, this could write to disk
|
|
630
|
+
|
|
631
|
+
# ========================================================================
|
|
632
|
+
# Public API Methods
|
|
633
|
+
# ========================================================================
|
|
634
|
+
|
|
635
|
+
def get_agent(self, name: str) -> Optional[AgentMetadata]:
|
|
636
|
+
"""Get agent metadata by name."""
|
|
637
|
+
if not self.registry:
|
|
638
|
+
self.discover_agents()
|
|
639
|
+
|
|
640
|
+
return self.registry.get(name)
|
|
641
|
+
|
|
642
|
+
def list_agents(
|
|
643
|
+
self,
|
|
644
|
+
tier: Optional[AgentTier] = None,
|
|
645
|
+
agent_type: Optional[AgentType] = None,
|
|
646
|
+
tags: Optional[List[str]] = None,
|
|
647
|
+
) -> List[AgentMetadata]:
|
|
648
|
+
"""List agents with optional filtering."""
|
|
649
|
+
if not self.registry:
|
|
650
|
+
self.discover_agents()
|
|
651
|
+
|
|
652
|
+
agents = list(self.registry.values())
|
|
653
|
+
|
|
654
|
+
# Apply filters
|
|
655
|
+
if tier:
|
|
656
|
+
agents = [a for a in agents if a.tier == tier]
|
|
657
|
+
|
|
658
|
+
if agent_type:
|
|
659
|
+
agents = [a for a in agents if a.agent_type == agent_type]
|
|
660
|
+
|
|
661
|
+
if tags:
|
|
662
|
+
agents = [a for a in agents if any(tag in a.tags for tag in tags)]
|
|
663
|
+
|
|
664
|
+
return sorted(agents, key=lambda a: (a.tier.value, a.name))
|
|
665
|
+
|
|
666
|
+
def get_agent_names(self) -> List[str]:
|
|
667
|
+
"""Get list of all agent names."""
|
|
668
|
+
if not self.registry:
|
|
669
|
+
self.discover_agents()
|
|
670
|
+
|
|
671
|
+
return sorted(self.registry.keys())
|
|
672
|
+
|
|
673
|
+
def get_core_agents(self) -> List[AgentMetadata]:
|
|
674
|
+
"""Get all core framework agents."""
|
|
675
|
+
return self.list_agents(agent_type=AgentType.CORE)
|
|
676
|
+
|
|
677
|
+
def get_specialized_agents(self) -> List[AgentMetadata]:
|
|
678
|
+
"""Get all specialized agents."""
|
|
679
|
+
return self.list_agents(agent_type=AgentType.SPECIALIZED)
|
|
680
|
+
|
|
681
|
+
def get_project_agents(self) -> List[AgentMetadata]:
|
|
682
|
+
"""Get all project-specific agents."""
|
|
683
|
+
return self.list_agents(tier=AgentTier.PROJECT)
|
|
684
|
+
|
|
685
|
+
def get_memory_aware_agents(self) -> List[AgentMetadata]:
|
|
686
|
+
"""Get all memory-aware agents."""
|
|
687
|
+
return self.list_agents(agent_type=AgentType.MEMORY_AWARE)
|
|
688
|
+
|
|
689
|
+
def get_agents_by_collection(self, collection_id: str) -> List[AgentMetadata]:
|
|
690
|
+
"""Get all agents from a specific collection.
|
|
691
|
+
|
|
692
|
+
NEW: Enables collection-based agent selection.
|
|
693
|
+
|
|
694
|
+
Args:
|
|
695
|
+
collection_id: Collection identifier (e.g., "bobmatnyc/claude-mpm-agents")
|
|
696
|
+
|
|
697
|
+
Returns:
|
|
698
|
+
List of agents from the specified collection
|
|
699
|
+
|
|
700
|
+
Example:
|
|
701
|
+
>>> registry = get_agent_registry()
|
|
702
|
+
>>> agents = registry.get_agents_by_collection("bobmatnyc/claude-mpm-agents")
|
|
703
|
+
>>> len(agents)
|
|
704
|
+
45
|
|
705
|
+
"""
|
|
706
|
+
if not self.registry:
|
|
707
|
+
self.discover_agents()
|
|
708
|
+
|
|
709
|
+
collection_agents = [
|
|
710
|
+
agent
|
|
711
|
+
for agent in self.registry.values()
|
|
712
|
+
if agent.collection_id == collection_id
|
|
713
|
+
]
|
|
714
|
+
|
|
715
|
+
return sorted(collection_agents, key=lambda a: a.name)
|
|
716
|
+
|
|
717
|
+
def list_collections(self) -> List[Dict[str, Any]]:
|
|
718
|
+
"""List all available collections with agent counts.
|
|
719
|
+
|
|
720
|
+
NEW: Provides overview of available collections.
|
|
721
|
+
|
|
722
|
+
Returns:
|
|
723
|
+
List of collection info dictionaries with:
|
|
724
|
+
- collection_id: Collection identifier
|
|
725
|
+
- agent_count: Number of agents in collection
|
|
726
|
+
- agents: List of agent names in collection
|
|
727
|
+
|
|
728
|
+
Example:
|
|
729
|
+
>>> registry = get_agent_registry()
|
|
730
|
+
>>> collections = registry.list_collections()
|
|
731
|
+
>>> collections
|
|
732
|
+
[
|
|
733
|
+
{
|
|
734
|
+
"collection_id": "bobmatnyc/claude-mpm-agents",
|
|
735
|
+
"agent_count": 45,
|
|
736
|
+
"agents": ["pm", "engineer", "qa", ...]
|
|
737
|
+
}
|
|
738
|
+
]
|
|
739
|
+
"""
|
|
740
|
+
if not self.registry:
|
|
741
|
+
self.discover_agents()
|
|
742
|
+
|
|
743
|
+
# Group agents by collection_id
|
|
744
|
+
collections_map: Dict[str, List[str]] = {}
|
|
745
|
+
|
|
746
|
+
for agent in self.registry.values():
|
|
747
|
+
if not agent.collection_id:
|
|
748
|
+
# Skip agents without collection (legacy or local)
|
|
749
|
+
continue
|
|
750
|
+
|
|
751
|
+
if agent.collection_id not in collections_map:
|
|
752
|
+
collections_map[agent.collection_id] = []
|
|
753
|
+
|
|
754
|
+
collections_map[agent.collection_id].append(agent.name)
|
|
755
|
+
|
|
756
|
+
# Convert to list format
|
|
757
|
+
collections = [
|
|
758
|
+
{
|
|
759
|
+
"collection_id": coll_id,
|
|
760
|
+
"agent_count": len(agent_names),
|
|
761
|
+
"agents": sorted(agent_names),
|
|
762
|
+
}
|
|
763
|
+
for coll_id, agent_names in collections_map.items()
|
|
764
|
+
]
|
|
765
|
+
|
|
766
|
+
return sorted(collections, key=lambda c: c["collection_id"])
|
|
767
|
+
|
|
768
|
+
def get_agent_by_canonical_id(self, canonical_id: str) -> Optional[AgentMetadata]:
|
|
769
|
+
"""Get agent by canonical ID (primary matching key).
|
|
770
|
+
|
|
771
|
+
NEW: Primary matching method using canonical_id.
|
|
772
|
+
|
|
773
|
+
Args:
|
|
774
|
+
canonical_id: Canonical identifier (e.g., "bobmatnyc/claude-mpm-agents:pm")
|
|
775
|
+
|
|
776
|
+
Returns:
|
|
777
|
+
AgentMetadata if found, None otherwise
|
|
778
|
+
|
|
779
|
+
Example:
|
|
780
|
+
>>> registry = get_agent_registry()
|
|
781
|
+
>>> agent = registry.get_agent_by_canonical_id("bobmatnyc/claude-mpm-agents:pm")
|
|
782
|
+
>>> agent.name
|
|
783
|
+
'Project Manager Agent'
|
|
784
|
+
"""
|
|
785
|
+
if not self.registry:
|
|
786
|
+
self.discover_agents()
|
|
787
|
+
|
|
788
|
+
for agent in self.registry.values():
|
|
789
|
+
if agent.canonical_id == canonical_id:
|
|
790
|
+
return agent
|
|
791
|
+
|
|
792
|
+
return None
|
|
793
|
+
|
|
794
|
+
def add_discovery_path(self, path: Union[str, Path]) -> None:
|
|
795
|
+
"""Add a new path for agent discovery."""
|
|
796
|
+
path = Path(path)
|
|
797
|
+
if path.exists() and path not in self.discovery_paths:
|
|
798
|
+
self.discovery_paths.append(path)
|
|
799
|
+
logger.info(f"Added discovery path: {path}")
|
|
800
|
+
# Force re-discovery with new path
|
|
801
|
+
self.discover_agents(force_refresh=True)
|
|
802
|
+
|
|
803
|
+
def invalidate_cache(self) -> None:
|
|
804
|
+
"""Invalidate the current cache."""
|
|
805
|
+
self.discovery_stats["last_discovery"] = None
|
|
806
|
+
logger.debug("Agent registry cache invalidated")
|
|
807
|
+
|
|
808
|
+
def get_registry_stats(self) -> Dict[str, Any]:
|
|
809
|
+
"""Get registry statistics."""
|
|
810
|
+
return {
|
|
811
|
+
**self.discovery_stats,
|
|
812
|
+
"total_agents": len(self.registry),
|
|
813
|
+
"discovery_paths": [str(p) for p in self.discovery_paths],
|
|
814
|
+
"cache_enabled": self.cache_enabled,
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
def export_registry(self, output_path: Union[str, Path]) -> None:
|
|
818
|
+
"""Export registry to JSON file."""
|
|
819
|
+
output_path = Path(output_path)
|
|
820
|
+
|
|
821
|
+
export_data = {
|
|
822
|
+
"metadata": {
|
|
823
|
+
"export_time": datetime.now(timezone.utc).isoformat(),
|
|
824
|
+
"total_agents": len(self.registry),
|
|
825
|
+
"discovery_paths": [str(p) for p in self.discovery_paths],
|
|
826
|
+
},
|
|
827
|
+
"agents": {
|
|
828
|
+
name: metadata.to_dict() for name, metadata in self.registry.items()
|
|
829
|
+
},
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
with output_path.open("w") as f:
|
|
833
|
+
json.dump(export_data, f, indent=2)
|
|
834
|
+
|
|
835
|
+
logger.info(f"Exported {len(self.registry)} agents to {output_path}")
|
|
836
|
+
|
|
837
|
+
def import_registry(self, input_path: Union[str, Path]) -> None:
|
|
838
|
+
"""Import registry from JSON file."""
|
|
839
|
+
input_path = Path(input_path)
|
|
840
|
+
|
|
841
|
+
with input_path.open() as f:
|
|
842
|
+
data = json.load(f)
|
|
843
|
+
|
|
844
|
+
# Clear current registry
|
|
845
|
+
self.registry.clear()
|
|
846
|
+
|
|
847
|
+
# Import agents
|
|
848
|
+
for name, agent_data in data.get("agents", {}).items():
|
|
849
|
+
self.registry[name] = AgentMetadata.from_dict(agent_data)
|
|
850
|
+
|
|
851
|
+
logger.info(f"Imported {len(self.registry)} agents from {input_path}")
|
|
852
|
+
|
|
853
|
+
|
|
854
|
+
# ============================================================================
|
|
855
|
+
# Singleton Instance and Convenience Functions
|
|
856
|
+
# ============================================================================
|
|
857
|
+
|
|
858
|
+
# Global singleton instance
|
|
859
|
+
_agent_registry: Optional[UnifiedAgentRegistry] = None
|
|
860
|
+
|
|
861
|
+
|
|
862
|
+
def get_agent_registry() -> UnifiedAgentRegistry:
|
|
863
|
+
"""Get the global UnifiedAgentRegistry instance."""
|
|
864
|
+
global _agent_registry
|
|
865
|
+
if _agent_registry is None:
|
|
866
|
+
_agent_registry = UnifiedAgentRegistry()
|
|
867
|
+
return _agent_registry
|
|
868
|
+
|
|
869
|
+
|
|
870
|
+
# Convenience functions for backward compatibility
|
|
871
|
+
def discover_agents() -> Dict[str, AgentMetadata]:
|
|
872
|
+
"""Discover all agents."""
|
|
873
|
+
return get_agent_registry().discover_agents()
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
def list_agents(
|
|
877
|
+
tier: Optional[AgentTier] = None, agent_type: Optional[AgentType] = None
|
|
878
|
+
) -> List[AgentMetadata]:
|
|
879
|
+
"""List agents with optional filtering."""
|
|
880
|
+
return get_agent_registry().list_agents(tier=tier, agent_type=agent_type)
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
def get_agent(name: str) -> Optional[AgentMetadata]:
|
|
884
|
+
"""Get agent metadata by name."""
|
|
885
|
+
return get_agent_registry().get_agent(name)
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
def get_core_agents() -> List[AgentMetadata]:
|
|
889
|
+
"""Get all core framework agents."""
|
|
890
|
+
return get_agent_registry().get_core_agents()
|
|
891
|
+
|
|
892
|
+
|
|
893
|
+
def get_specialized_agents() -> List[AgentMetadata]:
|
|
894
|
+
"""Get all specialized agents."""
|
|
895
|
+
return get_agent_registry().get_specialized_agents()
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
def get_project_agents() -> List[AgentMetadata]:
|
|
899
|
+
"""Get all project-specific agents."""
|
|
900
|
+
return get_agent_registry().get_project_agents()
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
def get_agent_names() -> List[str]:
|
|
904
|
+
"""Get list of all agent names."""
|
|
905
|
+
return get_agent_registry().get_agent_names()
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
def get_registry_stats() -> Dict[str, Any]:
|
|
909
|
+
"""Get registry statistics."""
|
|
910
|
+
return get_agent_registry().get_registry_stats()
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
def get_agents_by_collection(collection_id: str) -> List[AgentMetadata]:
|
|
914
|
+
"""Get all agents from a specific collection."""
|
|
915
|
+
return get_agent_registry().get_agents_by_collection(collection_id)
|
|
916
|
+
|
|
917
|
+
|
|
918
|
+
def list_collections() -> List[Dict[str, Any]]:
|
|
919
|
+
"""List all available collections."""
|
|
920
|
+
return get_agent_registry().list_collections()
|
|
921
|
+
|
|
922
|
+
|
|
923
|
+
def get_agent_by_canonical_id(canonical_id: str) -> Optional[AgentMetadata]:
|
|
924
|
+
"""Get agent by canonical ID."""
|
|
925
|
+
return get_agent_registry().get_agent_by_canonical_id(canonical_id)
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
# Legacy function names for backward compatibility
|
|
929
|
+
def listAgents() -> List[str]:
|
|
930
|
+
"""Legacy function: Get list of agent names."""
|
|
931
|
+
return get_agent_names()
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
def discover_agents_sync() -> Dict[str, AgentMetadata]:
|
|
935
|
+
"""Legacy function: Synchronous agent discovery."""
|
|
936
|
+
return discover_agents()
|
|
937
|
+
|
|
938
|
+
|
|
939
|
+
def list_agents_all() -> List[AgentMetadata]:
|
|
940
|
+
"""Legacy function: List all agents."""
|
|
941
|
+
return list_agents()
|
|
942
|
+
|
|
943
|
+
|
|
944
|
+
# ============================================================================
|
|
945
|
+
# Export All Public Symbols
|
|
946
|
+
# ============================================================================
|
|
947
|
+
|
|
948
|
+
__all__ = [
|
|
949
|
+
"AgentFormat",
|
|
950
|
+
"AgentMetadata",
|
|
951
|
+
"AgentTier",
|
|
952
|
+
"AgentType",
|
|
953
|
+
"UnifiedAgentRegistry",
|
|
954
|
+
"discover_agents",
|
|
955
|
+
"discover_agents_sync",
|
|
956
|
+
"get_agent",
|
|
957
|
+
"get_agent_by_canonical_id",
|
|
958
|
+
"get_agent_names",
|
|
959
|
+
"get_agent_registry",
|
|
960
|
+
"get_agents_by_collection",
|
|
961
|
+
"get_core_agents",
|
|
962
|
+
"get_project_agents",
|
|
963
|
+
"get_registry_stats",
|
|
964
|
+
"get_specialized_agents",
|
|
965
|
+
"listAgents",
|
|
966
|
+
"list_agents",
|
|
967
|
+
"list_agents_all",
|
|
968
|
+
"list_collections",
|
|
969
|
+
]
|