claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -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/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/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- 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/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -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/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- 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_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- 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 +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- 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/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- 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 +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -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 +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- 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/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -31,6 +31,7 @@ import time
|
|
|
31
31
|
from pathlib import Path
|
|
32
32
|
from typing import Any, Dict, List, Optional, Tuple
|
|
33
33
|
|
|
34
|
+
from claude_mpm.config.agent_sources import AgentSourceConfiguration
|
|
34
35
|
from claude_mpm.config.paths import paths
|
|
35
36
|
from claude_mpm.constants import Paths
|
|
36
37
|
from claude_mpm.core.config import Config
|
|
@@ -38,6 +39,8 @@ from claude_mpm.core.exceptions import AgentDeploymentError
|
|
|
38
39
|
from claude_mpm.core.interfaces import AgentDeploymentInterface
|
|
39
40
|
from claude_mpm.services.shared import ConfigServiceBase
|
|
40
41
|
|
|
42
|
+
# Import git source management for remote agent sync
|
|
43
|
+
from ..git_source_manager import GitSourceManager
|
|
41
44
|
from .agent_configuration_manager import AgentConfigurationManager
|
|
42
45
|
from .agent_discovery_service import AgentDiscoveryService
|
|
43
46
|
from .agent_environment_manager import AgentEnvironmentManager
|
|
@@ -184,9 +187,110 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
184
187
|
# Initialize format converter service
|
|
185
188
|
self.format_converter = AgentFormatConverter()
|
|
186
189
|
|
|
190
|
+
# Initialize git source manager for remote agent sync
|
|
191
|
+
self.git_source_manager = GitSourceManager()
|
|
192
|
+
self.agent_source_config = AgentSourceConfiguration.load()
|
|
193
|
+
|
|
187
194
|
self.logger.info(f"Templates directory: {self.templates_dir}")
|
|
188
195
|
self.logger.info(f"Base agent path: {self.base_agent_path}")
|
|
189
196
|
|
|
197
|
+
def _sync_remote_agent_sources(self, timeout_seconds: int = 30) -> Dict[str, Any]:
|
|
198
|
+
"""Sync git-based agent sources before deployment.
|
|
199
|
+
|
|
200
|
+
This method follows the skills system pattern: sync configured git repositories
|
|
201
|
+
to cache before discovery. Network failures are logged but don't block deployment.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
timeout_seconds: Timeout for git operations (default: 30 seconds)
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
Dictionary with sync results:
|
|
208
|
+
{
|
|
209
|
+
"synced_count": int,
|
|
210
|
+
"failed_count": int,
|
|
211
|
+
"repositories": Dict[str, Dict], # repo_id -> sync result
|
|
212
|
+
"duration_ms": float
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
Error Handling:
|
|
216
|
+
- Network failures: Logged as warnings, sync continues
|
|
217
|
+
- Invalid repos: Logged as errors, sync continues
|
|
218
|
+
- Timeout: Individual repo timeouts don't stop overall sync
|
|
219
|
+
- Missing cache dir: Created automatically
|
|
220
|
+
"""
|
|
221
|
+
import time
|
|
222
|
+
|
|
223
|
+
start_time = time.time()
|
|
224
|
+
|
|
225
|
+
results = {
|
|
226
|
+
"synced_count": 0,
|
|
227
|
+
"failed_count": 0,
|
|
228
|
+
"repositories": {},
|
|
229
|
+
"duration_ms": 0,
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
# Load agent sources configuration
|
|
233
|
+
try:
|
|
234
|
+
config = AgentSourceConfiguration.load()
|
|
235
|
+
enabled_repos = [r for r in config.repositories if r.enabled]
|
|
236
|
+
|
|
237
|
+
if not enabled_repos:
|
|
238
|
+
self.logger.debug("No enabled agent sources configured")
|
|
239
|
+
return results
|
|
240
|
+
|
|
241
|
+
self.logger.info(f"Syncing {len(enabled_repos)} agent git sources...")
|
|
242
|
+
|
|
243
|
+
# Sync each enabled repository
|
|
244
|
+
for repo in enabled_repos:
|
|
245
|
+
repo_id = repo.identifier
|
|
246
|
+
try:
|
|
247
|
+
# Sync with timeout (individual repo sync)
|
|
248
|
+
# NOTE: show_progress=False to avoid duplicate progress bars
|
|
249
|
+
# (startup sync already showed progress to user)
|
|
250
|
+
sync_result = self.git_source_manager.sync_repository(
|
|
251
|
+
repo,
|
|
252
|
+
force=False, # Use ETag-based caching
|
|
253
|
+
show_progress=False, # Suppress progress (startup already synced)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
results["repositories"][repo_id] = sync_result
|
|
257
|
+
|
|
258
|
+
if sync_result.get("synced"):
|
|
259
|
+
results["synced_count"] += 1
|
|
260
|
+
agents_discovered = sync_result.get("agents_discovered", [])
|
|
261
|
+
self.logger.info(
|
|
262
|
+
f"Synced {repo_id}: {sync_result.get('files_updated', 0)} files, "
|
|
263
|
+
f"{len(agents_discovered)} agents"
|
|
264
|
+
)
|
|
265
|
+
else:
|
|
266
|
+
results["failed_count"] += 1
|
|
267
|
+
error = sync_result.get("error", "Unknown error")
|
|
268
|
+
self.logger.warning(f"Failed to sync {repo_id}: {error}")
|
|
269
|
+
|
|
270
|
+
except Exception as e:
|
|
271
|
+
# Don't let individual repo failures stop deployment
|
|
272
|
+
results["failed_count"] += 1
|
|
273
|
+
results["repositories"][repo_id] = {
|
|
274
|
+
"synced": False,
|
|
275
|
+
"error": str(e),
|
|
276
|
+
}
|
|
277
|
+
self.logger.warning(f"Exception syncing {repo_id}: {e}")
|
|
278
|
+
|
|
279
|
+
except Exception as e:
|
|
280
|
+
# Configuration loading failure - log but don't crash
|
|
281
|
+
self.logger.warning(f"Failed to load agent sources config: {e}")
|
|
282
|
+
results["failed_count"] = -1 # Indicates config failure
|
|
283
|
+
|
|
284
|
+
results["duration_ms"] = (time.time() - start_time) * 1000
|
|
285
|
+
|
|
286
|
+
if results["synced_count"] > 0:
|
|
287
|
+
self.logger.info(
|
|
288
|
+
f"Agent source sync complete: {results['synced_count']} succeeded, "
|
|
289
|
+
f"{results['failed_count']} failed ({results['duration_ms']:.0f}ms)"
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
return results
|
|
293
|
+
|
|
190
294
|
def deploy_agents(
|
|
191
295
|
self,
|
|
192
296
|
target_dir: Optional[Path] = None,
|
|
@@ -267,6 +371,10 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
267
371
|
# METRICS: Record deployment start time for performance tracking
|
|
268
372
|
deployment_start_time = time.time()
|
|
269
373
|
|
|
374
|
+
# PHASE 2 (1M-442): Sync git-based agent sources before deployment
|
|
375
|
+
# This ensures remote agents from configured sources are cached and discoverable
|
|
376
|
+
sync_results = self._sync_remote_agent_sources()
|
|
377
|
+
|
|
270
378
|
# Try async deployment for better performance if requested
|
|
271
379
|
if use_async:
|
|
272
380
|
async_results = self._try_async_deployment(
|
|
@@ -292,6 +400,13 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
292
400
|
agents_dir, deployment_start_time
|
|
293
401
|
)
|
|
294
402
|
|
|
403
|
+
# Add git source sync results to deployment results
|
|
404
|
+
if (
|
|
405
|
+
sync_results.get("synced_count", 0) > 0
|
|
406
|
+
or sync_results.get("failed_count", 0) > 0
|
|
407
|
+
):
|
|
408
|
+
results["remote_sources"] = sync_results
|
|
409
|
+
|
|
295
410
|
try:
|
|
296
411
|
# Create agents directory if needed
|
|
297
412
|
agents_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -754,19 +869,28 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
754
869
|
project_agents_dir = potential_project_dir
|
|
755
870
|
self.logger.info(f"Found project agents at: {project_agents_dir}")
|
|
756
871
|
|
|
757
|
-
# Check for user agents
|
|
872
|
+
# Check for user agents (DEPRECATED)
|
|
758
873
|
user_home = Path.home()
|
|
759
874
|
potential_user_dir = user_home / ".claude-mpm" / "agents"
|
|
760
875
|
if potential_user_dir.exists():
|
|
761
876
|
user_agents_dir = potential_user_dir
|
|
762
877
|
self.logger.info(f"Found user agents at: {user_agents_dir}")
|
|
763
878
|
|
|
764
|
-
#
|
|
879
|
+
# Check for agents cache (from Git sources)
|
|
880
|
+
agents_cache_dir = None
|
|
881
|
+
cache_dir = user_home / ".claude-mpm" / "cache"
|
|
882
|
+
potential_cache_dir = cache_dir / "agents"
|
|
883
|
+
if potential_cache_dir.exists():
|
|
884
|
+
agents_cache_dir = potential_cache_dir
|
|
885
|
+
self.logger.info(f"Found agents cache at: {agents_cache_dir}")
|
|
886
|
+
|
|
887
|
+
# Get agents with version comparison and cleanup (4-tier discovery)
|
|
765
888
|
agents_to_deploy, agent_sources, cleanup_results = (
|
|
766
889
|
self.multi_source_service.get_agents_for_deployment(
|
|
767
890
|
system_templates_dir=system_templates_dir,
|
|
768
891
|
project_agents_dir=project_agents_dir,
|
|
769
892
|
user_agents_dir=user_agents_dir,
|
|
893
|
+
agents_cache_dir=agents_cache_dir, # NEW: 4th tier
|
|
770
894
|
working_directory=self.working_directory,
|
|
771
895
|
excluded_agents=excluded_agents,
|
|
772
896
|
config=config,
|
|
@@ -774,6 +898,9 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
774
898
|
)
|
|
775
899
|
)
|
|
776
900
|
|
|
901
|
+
# Keep track of all enabled agents before filtering (for cleanup)
|
|
902
|
+
all_enabled_agents = agents_to_deploy.copy()
|
|
903
|
+
|
|
777
904
|
# Compare with deployed versions if agents directory exists
|
|
778
905
|
if agents_dir.exists():
|
|
779
906
|
comparison_results = self.multi_source_service.compare_deployed_versions(
|
|
@@ -830,6 +957,25 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
830
957
|
f"All {len(comparison_results.get('up_to_date', []))} agents are up to date"
|
|
831
958
|
)
|
|
832
959
|
|
|
960
|
+
# Cleanup excluded agents (remove agents not in deployment list)
|
|
961
|
+
# CRITICAL: Use all_enabled_agents (before filtering for updates) to preserve up-to-date agents
|
|
962
|
+
# Bug fix (1M-XXX): Previously used filtered agents_to_deploy which could be empty,
|
|
963
|
+
# causing all agents to be removed when everything was up-to-date
|
|
964
|
+
exclusion_cleanup_results = self.multi_source_service.cleanup_excluded_agents(
|
|
965
|
+
deployed_agents_dir=agents_dir,
|
|
966
|
+
agents_to_deploy=all_enabled_agents,
|
|
967
|
+
)
|
|
968
|
+
|
|
969
|
+
# Add exclusion cleanup results to main cleanup results
|
|
970
|
+
if exclusion_cleanup_results.get("removed"):
|
|
971
|
+
cleanup_results.setdefault("excluded_removed", []).extend(
|
|
972
|
+
exclusion_cleanup_results["removed"]
|
|
973
|
+
)
|
|
974
|
+
self.logger.info(
|
|
975
|
+
f"Removed {len(exclusion_cleanup_results['removed'])} excluded agents: "
|
|
976
|
+
f"{', '.join(exclusion_cleanup_results['removed'])}"
|
|
977
|
+
)
|
|
978
|
+
|
|
833
979
|
# Convert to list of Path objects
|
|
834
980
|
template_files = list(agents_to_deploy.values())
|
|
835
981
|
|
|
@@ -7,10 +7,11 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
|
|
|
7
7
|
maintainability and testability.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import json
|
|
11
10
|
from pathlib import Path
|
|
12
11
|
from typing import Any, Dict, List, Optional
|
|
13
12
|
|
|
13
|
+
import yaml
|
|
14
|
+
|
|
14
15
|
from claude_mpm.core.config import Config
|
|
15
16
|
from claude_mpm.core.logging_config import get_logger
|
|
16
17
|
|
|
@@ -59,8 +60,8 @@ class AgentDiscoveryService:
|
|
|
59
60
|
)
|
|
60
61
|
return agents
|
|
61
62
|
|
|
62
|
-
# Find all
|
|
63
|
-
template_files = list(self.templates_dir.glob("*.
|
|
63
|
+
# Find all markdown template files with YAML frontmatter
|
|
64
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
64
65
|
|
|
65
66
|
for template_file in template_files:
|
|
66
67
|
try:
|
|
@@ -105,8 +106,8 @@ class AgentDiscoveryService:
|
|
|
105
106
|
self.logger.error(f"Templates directory not found: {self.templates_dir}")
|
|
106
107
|
return []
|
|
107
108
|
|
|
108
|
-
# Get all template files
|
|
109
|
-
template_files = list(self.templates_dir.glob("*.
|
|
109
|
+
# Get all markdown template files
|
|
110
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
110
111
|
|
|
111
112
|
if not template_files:
|
|
112
113
|
self.logger.warning(f"No agent templates found in {self.templates_dir}")
|
|
@@ -157,7 +158,7 @@ class AgentDiscoveryService:
|
|
|
157
158
|
Returns:
|
|
158
159
|
Path to template file if found, None otherwise
|
|
159
160
|
"""
|
|
160
|
-
template_file = self.templates_dir / f"{agent_name}.
|
|
161
|
+
template_file = self.templates_dir / f"{agent_name}.md"
|
|
161
162
|
|
|
162
163
|
if template_file.exists():
|
|
163
164
|
if self._validate_template_file(template_file):
|
|
@@ -199,59 +200,44 @@ class AgentDiscoveryService:
|
|
|
199
200
|
|
|
200
201
|
def _extract_agent_metadata(self, template_file: Path) -> Optional[Dict[str, Any]]:
|
|
201
202
|
"""
|
|
202
|
-
Extract metadata from an agent template file.
|
|
203
|
+
Extract metadata from an agent template file with YAML frontmatter.
|
|
203
204
|
|
|
204
205
|
Args:
|
|
205
|
-
template_file: Path to the template file
|
|
206
|
+
template_file: Path to the markdown template file
|
|
206
207
|
|
|
207
208
|
Returns:
|
|
208
209
|
Dictionary with agent metadata or None if extraction fails
|
|
209
210
|
"""
|
|
210
211
|
try:
|
|
211
|
-
# Read
|
|
212
|
+
# Read template file content
|
|
212
213
|
template_content = template_file.read_text()
|
|
213
|
-
template_data = json.loads(template_content)
|
|
214
|
-
|
|
215
|
-
# Extract basic metadata from the metadata section (per agent schema)
|
|
216
|
-
metadata = template_data.get("metadata", {})
|
|
217
|
-
capabilities = template_data.get("capabilities", {})
|
|
218
|
-
|
|
219
|
-
# Handle capabilities as either dict or list
|
|
220
|
-
if isinstance(capabilities, list):
|
|
221
|
-
# If capabilities is a list (like in php-engineer.json), treat it as capabilities list
|
|
222
|
-
tools_list = template_data.get(
|
|
223
|
-
"tools", []
|
|
224
|
-
) # Look for tools at root level
|
|
225
|
-
model_value = template_data.get("model", "sonnet")
|
|
226
|
-
else:
|
|
227
|
-
# If capabilities is a dict, extract tools and model from it
|
|
228
|
-
tools_list = capabilities.get("tools", [])
|
|
229
|
-
model_value = capabilities.get("model", "sonnet")
|
|
230
214
|
|
|
215
|
+
# Extract YAML frontmatter
|
|
216
|
+
frontmatter = self._extract_yaml_frontmatter(template_content)
|
|
217
|
+
if not frontmatter:
|
|
218
|
+
# Silently return None for files without frontmatter
|
|
219
|
+
# (e.g., PM instruction templates in templates/ directory)
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
# Extract metadata directly from frontmatter (flat structure)
|
|
223
|
+
# Markdown templates use flat YAML structure, not nested "metadata" section
|
|
231
224
|
agent_info = {
|
|
232
|
-
"name":
|
|
233
|
-
"description":
|
|
234
|
-
"description",
|
|
235
|
-
template_data.get("description", "No description available"),
|
|
225
|
+
"name": frontmatter.get("name", template_file.stem),
|
|
226
|
+
"description": frontmatter.get(
|
|
227
|
+
"description", "No description available"
|
|
236
228
|
),
|
|
237
|
-
"type":
|
|
238
|
-
"agent_type",
|
|
239
|
-
metadata.get("category", template_data.get("category", "agent")),
|
|
240
|
-
), # Extract agent type
|
|
241
|
-
"version": template_data.get(
|
|
242
|
-
"agent_version",
|
|
243
|
-
template_data.get("version", metadata.get("version", "1.0.0")),
|
|
229
|
+
"type": frontmatter.get(
|
|
230
|
+
"agent_type", frontmatter.get("category", "agent")
|
|
244
231
|
),
|
|
245
|
-
"
|
|
246
|
-
"
|
|
247
|
-
|
|
248
|
-
), # Use tags as specializations, fallback to root-level tags
|
|
232
|
+
"version": frontmatter.get("version", "1.0.0"),
|
|
233
|
+
"tools": frontmatter.get("tools", []),
|
|
234
|
+
"specializations": frontmatter.get("tags", []),
|
|
249
235
|
"file": template_file.name,
|
|
250
236
|
"path": str(template_file),
|
|
251
237
|
"file_path": str(template_file), # Keep for backward compatibility
|
|
252
238
|
"size": template_file.stat().st_size,
|
|
253
|
-
"model":
|
|
254
|
-
"author":
|
|
239
|
+
"model": frontmatter.get("model", "sonnet"),
|
|
240
|
+
"author": frontmatter.get("author", "unknown"),
|
|
255
241
|
}
|
|
256
242
|
|
|
257
243
|
# Validate required fields
|
|
@@ -261,8 +247,8 @@ class AgentDiscoveryService:
|
|
|
261
247
|
|
|
262
248
|
return agent_info
|
|
263
249
|
|
|
264
|
-
except
|
|
265
|
-
self.logger.
|
|
250
|
+
except yaml.YAMLError as e:
|
|
251
|
+
self.logger.warning(f"Invalid YAML frontmatter in {template_file.name}: {e}")
|
|
266
252
|
return None
|
|
267
253
|
except Exception as e:
|
|
268
254
|
self.logger.error(
|
|
@@ -270,37 +256,73 @@ class AgentDiscoveryService:
|
|
|
270
256
|
)
|
|
271
257
|
return None
|
|
272
258
|
|
|
259
|
+
def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
|
|
260
|
+
"""
|
|
261
|
+
Extract and parse YAML frontmatter from markdown.
|
|
262
|
+
|
|
263
|
+
Frontmatter must be at the start of the file, delimited by '---'.
|
|
264
|
+
Example:
|
|
265
|
+
---
|
|
266
|
+
name: agent_name
|
|
267
|
+
description: Agent description
|
|
268
|
+
version: 1.0.0
|
|
269
|
+
---
|
|
270
|
+
# Agent content...
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
content: File content to parse
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
Parsed YAML frontmatter as dict, or None if not found/invalid
|
|
277
|
+
"""
|
|
278
|
+
if not content.strip().startswith("---"):
|
|
279
|
+
return None
|
|
280
|
+
|
|
281
|
+
# Split on --- delimiters
|
|
282
|
+
parts = content.split("---", 2)
|
|
283
|
+
if len(parts) < 3:
|
|
284
|
+
return None
|
|
285
|
+
|
|
286
|
+
try:
|
|
287
|
+
return yaml.safe_load(parts[1])
|
|
288
|
+
except yaml.YAMLError as e:
|
|
289
|
+
self.logger.warning(f"Failed to parse YAML frontmatter: {e}")
|
|
290
|
+
return None
|
|
291
|
+
|
|
273
292
|
def _is_mpm_agent(self, template_file: Path) -> bool:
|
|
274
293
|
"""Check if agent is authored by Claude MPM team.
|
|
275
294
|
|
|
276
295
|
MPM agents must have:
|
|
277
296
|
- An author field containing 'claude mpm', 'claude-mpm', or 'anthropic'
|
|
278
|
-
- A valid
|
|
297
|
+
- A valid version field
|
|
279
298
|
|
|
280
299
|
Args:
|
|
281
|
-
template_file: Path to the agent template
|
|
300
|
+
template_file: Path to the agent template markdown file
|
|
282
301
|
|
|
283
302
|
Returns:
|
|
284
303
|
True if this is an MPM agent, False otherwise
|
|
285
304
|
"""
|
|
286
305
|
try:
|
|
287
|
-
|
|
288
|
-
|
|
306
|
+
# Extract YAML frontmatter
|
|
307
|
+
content = template_file.read_text()
|
|
308
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
309
|
+
if not frontmatter:
|
|
310
|
+
return False
|
|
289
311
|
|
|
290
312
|
# Check for author field
|
|
291
|
-
author =
|
|
313
|
+
author = frontmatter.get("author", "").lower()
|
|
292
314
|
has_valid_author = any(
|
|
293
315
|
pattern in author
|
|
294
316
|
for pattern in ["claude mpm", "claude-mpm", "anthropic"]
|
|
295
317
|
)
|
|
296
318
|
|
|
297
319
|
# Check for version field
|
|
298
|
-
has_version = bool(
|
|
320
|
+
has_version = bool(frontmatter.get("version"))
|
|
299
321
|
|
|
300
322
|
if not has_valid_author or not has_version:
|
|
301
323
|
self.logger.debug(
|
|
302
324
|
f"Filtered non-MPM agent {template_file.name}: "
|
|
303
|
-
f"author='{
|
|
325
|
+
f"author='{frontmatter.get('author', 'missing')}', "
|
|
304
326
|
f"version={'present' if has_version else 'missing'}"
|
|
305
327
|
)
|
|
306
328
|
|
|
@@ -366,10 +388,10 @@ class AgentDiscoveryService:
|
|
|
366
388
|
|
|
367
389
|
def _validate_template_file(self, template_file: Path) -> bool:
|
|
368
390
|
"""
|
|
369
|
-
Validate that a template file is properly formatted.
|
|
391
|
+
Validate that a template file is properly formatted with YAML frontmatter.
|
|
370
392
|
|
|
371
393
|
Args:
|
|
372
|
-
template_file: Path to template file to validate
|
|
394
|
+
template_file: Path to markdown template file to validate
|
|
373
395
|
|
|
374
396
|
Returns:
|
|
375
397
|
True if template is valid, False otherwise
|
|
@@ -379,23 +401,27 @@ class AgentDiscoveryService:
|
|
|
379
401
|
if not template_file.exists():
|
|
380
402
|
return False
|
|
381
403
|
|
|
382
|
-
#
|
|
404
|
+
# Read and parse YAML frontmatter
|
|
383
405
|
content = template_file.read_text()
|
|
384
|
-
|
|
406
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
407
|
+
if not frontmatter:
|
|
408
|
+
self.logger.warning(
|
|
409
|
+
f"Template {template_file.name} has no valid YAML frontmatter"
|
|
410
|
+
)
|
|
411
|
+
return False
|
|
385
412
|
|
|
386
|
-
# Check required fields
|
|
387
|
-
metadata = template_data.get("metadata", {})
|
|
413
|
+
# Check required fields (flat structure in markdown templates)
|
|
388
414
|
required_fields = ["name", "description"]
|
|
389
415
|
for field in required_fields:
|
|
390
|
-
if field not in
|
|
416
|
+
if field not in frontmatter:
|
|
391
417
|
self.logger.warning(
|
|
392
|
-
f"Template {template_file.name} missing required field
|
|
418
|
+
f"Template {template_file.name} missing required field: {field}"
|
|
393
419
|
)
|
|
394
420
|
return False
|
|
395
421
|
|
|
396
422
|
# Validate agent ID format (Claude Code requirements)
|
|
397
423
|
# Use agent_id for validation, not the display name
|
|
398
|
-
agent_id =
|
|
424
|
+
agent_id = frontmatter.get("agent_id", "")
|
|
399
425
|
if not self._is_valid_agent_name(agent_id):
|
|
400
426
|
self.logger.warning(
|
|
401
427
|
f"Invalid agent ID format in {template_file.name}: {agent_id}"
|
|
@@ -404,8 +430,10 @@ class AgentDiscoveryService:
|
|
|
404
430
|
|
|
405
431
|
return True
|
|
406
432
|
|
|
407
|
-
except
|
|
408
|
-
self.logger.
|
|
433
|
+
except yaml.YAMLError:
|
|
434
|
+
self.logger.warning(
|
|
435
|
+
f"Invalid YAML frontmatter in template: {template_file.name}"
|
|
436
|
+
)
|
|
409
437
|
return False
|
|
410
438
|
except Exception as e:
|
|
411
439
|
self.logger.error(
|
|
@@ -431,25 +459,28 @@ class AgentDiscoveryService:
|
|
|
431
459
|
|
|
432
460
|
return bool(re.match(pattern, agent_name))
|
|
433
461
|
|
|
434
|
-
def
|
|
462
|
+
def _is_mpm_agent_with_config(
|
|
435
463
|
self, template_file: Path, config: Optional[Config] = None
|
|
436
464
|
) -> bool:
|
|
437
|
-
"""Check if agent is authored by Claude MPM team.
|
|
465
|
+
"""Check if agent is authored by Claude MPM team with configurable patterns.
|
|
438
466
|
|
|
439
467
|
MPM agents must have:
|
|
440
468
|
- An author field containing configurable MPM patterns (default: 'claude mpm', 'claude-mpm', 'anthropic')
|
|
441
|
-
- A valid
|
|
469
|
+
- A valid version field
|
|
442
470
|
|
|
443
471
|
Args:
|
|
444
|
-
template_file: Path to the agent template
|
|
472
|
+
template_file: Path to the agent template markdown file
|
|
445
473
|
config: Configuration object for MPM patterns
|
|
446
474
|
|
|
447
475
|
Returns:
|
|
448
476
|
True if this is an MPM agent, False otherwise
|
|
449
477
|
"""
|
|
450
478
|
try:
|
|
451
|
-
|
|
452
|
-
|
|
479
|
+
# Extract YAML frontmatter
|
|
480
|
+
content = template_file.read_text()
|
|
481
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
482
|
+
if not frontmatter:
|
|
483
|
+
return False
|
|
453
484
|
|
|
454
485
|
# Get MPM author patterns from config
|
|
455
486
|
if config:
|
|
@@ -461,13 +492,13 @@ class AgentDiscoveryService:
|
|
|
461
492
|
mpm_patterns = ["claude mpm", "claude-mpm", "anthropic"]
|
|
462
493
|
|
|
463
494
|
# Check for author field
|
|
464
|
-
author =
|
|
495
|
+
author = frontmatter.get("author", "").lower()
|
|
465
496
|
has_valid_author = any(
|
|
466
497
|
pattern.lower() in author for pattern in mpm_patterns
|
|
467
498
|
)
|
|
468
499
|
|
|
469
500
|
# Check for version field
|
|
470
|
-
has_version = bool(
|
|
501
|
+
has_version = bool(frontmatter.get("version"))
|
|
471
502
|
|
|
472
503
|
return has_valid_author and has_version
|
|
473
504
|
|
|
@@ -494,8 +525,8 @@ class AgentDiscoveryService:
|
|
|
494
525
|
if not self.templates_dir.exists():
|
|
495
526
|
return stats
|
|
496
527
|
|
|
497
|
-
# Count template files
|
|
498
|
-
template_files = list(self.templates_dir.glob("*.
|
|
528
|
+
# Count markdown template files
|
|
529
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
499
530
|
stats["total_templates"] = len(template_files)
|
|
500
531
|
|
|
501
532
|
# Validate each template
|
|
@@ -166,7 +166,7 @@ class AgentFormatConverter:
|
|
|
166
166
|
|
|
167
167
|
<example>
|
|
168
168
|
Context: When you need specialized assistance from the {name} agent.
|
|
169
|
-
user: "I need help with {agent_name.replace(
|
|
169
|
+
user: "I need help with {agent_name.replace("_", " ").replace("-", " ")} tasks"
|
|
170
170
|
assistant: "I'll use the {name} agent to provide specialized assistance."
|
|
171
171
|
</example>"""
|
|
172
172
|
|
|
@@ -63,11 +63,7 @@ from .agent_operation_service import (
|
|
|
63
63
|
LifecycleOperationResult,
|
|
64
64
|
)
|
|
65
65
|
from .agent_record_service import AgentRecordService
|
|
66
|
-
from .agent_state_service import
|
|
67
|
-
AgentLifecycleRecord,
|
|
68
|
-
AgentStateService,
|
|
69
|
-
LifecycleState,
|
|
70
|
-
)
|
|
66
|
+
from .agent_state_service import AgentLifecycleRecord, AgentStateService, LifecycleState
|
|
71
67
|
|
|
72
68
|
# Re-export for backward compatibility
|
|
73
69
|
__all__ = [
|
|
@@ -176,9 +176,9 @@ class AgentMetricsCollector:
|
|
|
176
176
|
agent_name: Name of the agent being validated
|
|
177
177
|
validation_time_ms: Validation time in milliseconds
|
|
178
178
|
"""
|
|
179
|
-
self._deployment_metrics["template_validation_times"][
|
|
180
|
-
|
|
181
|
-
|
|
179
|
+
self._deployment_metrics["template_validation_times"][agent_name] = (
|
|
180
|
+
validation_time_ms
|
|
181
|
+
)
|
|
182
182
|
|
|
183
183
|
def get_performance_summary(self) -> Dict[str, Any]:
|
|
184
184
|
"""
|
|
@@ -10,10 +10,7 @@ from typing import TYPE_CHECKING, Optional
|
|
|
10
10
|
from claude_mpm.core.path_ops import path_ops
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
|
-
from .agent_lifecycle_manager import
|
|
14
|
-
AgentLifecycleManager,
|
|
15
|
-
LifecycleOperationResult,
|
|
16
|
-
)
|
|
13
|
+
from .agent_lifecycle_manager import AgentLifecycleManager, LifecycleOperationResult
|
|
17
14
|
|
|
18
15
|
|
|
19
16
|
class AgentRestoreHandler:
|