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
|
@@ -16,24 +16,36 @@ import os
|
|
|
16
16
|
from pathlib import Path
|
|
17
17
|
from typing import Any, Dict, List, Optional, Tuple
|
|
18
18
|
|
|
19
|
+
import yaml
|
|
20
|
+
|
|
19
21
|
from claude_mpm.core.config import Config
|
|
20
22
|
from claude_mpm.core.logging_config import get_logger
|
|
21
23
|
|
|
22
24
|
from .agent_discovery_service import AgentDiscoveryService
|
|
23
25
|
from .agent_version_manager import AgentVersionManager
|
|
26
|
+
from .remote_agent_discovery_service import RemoteAgentDiscoveryService
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
class MultiSourceAgentDeploymentService:
|
|
27
30
|
"""Service for deploying agents from multiple sources with version comparison.
|
|
28
31
|
|
|
29
32
|
This service ensures that the highest version of each agent is deployed,
|
|
30
|
-
regardless of whether it comes from system templates, project agents,
|
|
31
|
-
user agents.
|
|
33
|
+
regardless of whether it comes from system templates, project agents,
|
|
34
|
+
user agents, or remote agents.
|
|
35
|
+
|
|
36
|
+
4-Tier Agent Discovery:
|
|
37
|
+
1. System templates (lowest priority) - Built-in agents
|
|
38
|
+
2. User agents (DEPRECATED) - User-level customizations (~/.claude-mpm/agents/)
|
|
39
|
+
3. Remote agents - Agents cached from GitHub
|
|
40
|
+
4. Project agents (highest priority) - Project-specific customizations
|
|
32
41
|
|
|
33
42
|
WHY: The current system processes agents from a single source at a time,
|
|
34
43
|
which can result in lower version agents being deployed if they exist in
|
|
35
44
|
a higher priority source. This service fixes that by comparing versions
|
|
36
45
|
across all sources.
|
|
46
|
+
|
|
47
|
+
DEPRECATION: User-level agents (~/.claude-mpm/agents/) are deprecated and
|
|
48
|
+
will be removed in v5.0.0. Use project-level agents instead.
|
|
37
49
|
"""
|
|
38
50
|
|
|
39
51
|
def __init__(self):
|
|
@@ -41,23 +53,156 @@ class MultiSourceAgentDeploymentService:
|
|
|
41
53
|
self.logger = get_logger(__name__)
|
|
42
54
|
self.version_manager = AgentVersionManager()
|
|
43
55
|
|
|
56
|
+
def _read_template_version(self, template_path: Path) -> Optional[str]:
|
|
57
|
+
"""Read version from template file (supports both .md and .json formats).
|
|
58
|
+
|
|
59
|
+
For .md files: Extract version from YAML frontmatter
|
|
60
|
+
For .json files: Extract version from JSON structure
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
template_path: Path to template file
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Version string or None if version cannot be extracted
|
|
67
|
+
"""
|
|
68
|
+
try:
|
|
69
|
+
if template_path.suffix == ".md":
|
|
70
|
+
# Parse markdown with YAML frontmatter
|
|
71
|
+
content = template_path.read_text()
|
|
72
|
+
|
|
73
|
+
# Extract YAML frontmatter (between --- markers)
|
|
74
|
+
if not content.strip().startswith("---"):
|
|
75
|
+
return None
|
|
76
|
+
|
|
77
|
+
parts = content.split("---", 2)
|
|
78
|
+
if len(parts) < 3:
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
# Parse YAML frontmatter
|
|
82
|
+
frontmatter = yaml.safe_load(parts[1])
|
|
83
|
+
if not frontmatter:
|
|
84
|
+
return None
|
|
85
|
+
|
|
86
|
+
# Extract version from frontmatter
|
|
87
|
+
version = frontmatter.get("version")
|
|
88
|
+
return version if version else None
|
|
89
|
+
|
|
90
|
+
if template_path.suffix == ".json":
|
|
91
|
+
# Parse JSON template
|
|
92
|
+
template_data = json.loads(template_path.read_text())
|
|
93
|
+
metadata = template_data.get("metadata", {})
|
|
94
|
+
version = (
|
|
95
|
+
template_data.get("agent_version")
|
|
96
|
+
or template_data.get("version")
|
|
97
|
+
or metadata.get("version")
|
|
98
|
+
)
|
|
99
|
+
return version if version else None
|
|
100
|
+
|
|
101
|
+
self.logger.warning(
|
|
102
|
+
f"Unknown template format: {template_path.suffix} for {template_path.name}"
|
|
103
|
+
)
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
except yaml.YAMLError as e:
|
|
107
|
+
self.logger.warning(
|
|
108
|
+
f"Invalid YAML frontmatter in {template_path.name}: {e}"
|
|
109
|
+
)
|
|
110
|
+
return None
|
|
111
|
+
except json.JSONDecodeError as e:
|
|
112
|
+
self.logger.warning(f"Invalid JSON in {template_path.name}: {e}")
|
|
113
|
+
return None
|
|
114
|
+
except Exception as e:
|
|
115
|
+
self.logger.warning(
|
|
116
|
+
f"Error reading template version from {template_path.name}: {e}"
|
|
117
|
+
)
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
def _build_canonical_id_for_agent(self, agent_info: Dict[str, Any]) -> str:
|
|
121
|
+
"""Build or retrieve canonical_id for an agent.
|
|
122
|
+
|
|
123
|
+
NEW: Supports enhanced agent matching via canonical_id.
|
|
124
|
+
|
|
125
|
+
Priority:
|
|
126
|
+
1. Use existing canonical_id from agent_info if present
|
|
127
|
+
2. Generate from collection_id + agent_id if available
|
|
128
|
+
3. Fallback to legacy:{filename} for backward compatibility
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
agent_info: Agent dictionary with metadata
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Canonical ID string for matching
|
|
135
|
+
|
|
136
|
+
Example:
|
|
137
|
+
Remote agent: "bobmatnyc/claude-mpm-agents:pm"
|
|
138
|
+
Legacy agent: "legacy:custom-agent"
|
|
139
|
+
"""
|
|
140
|
+
# Priority 1: Existing canonical_id
|
|
141
|
+
if "canonical_id" in agent_info:
|
|
142
|
+
return agent_info["canonical_id"]
|
|
143
|
+
|
|
144
|
+
# Priority 2: Generate from collection_id + agent_id
|
|
145
|
+
collection_id = agent_info.get("collection_id")
|
|
146
|
+
agent_id = agent_info.get("agent_id")
|
|
147
|
+
|
|
148
|
+
if collection_id and agent_id:
|
|
149
|
+
canonical_id = f"{collection_id}:{agent_id}"
|
|
150
|
+
# Cache it in agent_info for future use
|
|
151
|
+
agent_info["canonical_id"] = canonical_id
|
|
152
|
+
return canonical_id
|
|
153
|
+
|
|
154
|
+
# Priority 3: Fallback to legacy format
|
|
155
|
+
# Use filename or agent name
|
|
156
|
+
agent_name = agent_info.get("name") or agent_info.get("metadata", {}).get(
|
|
157
|
+
"name", "unknown"
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# Extract filename from path
|
|
161
|
+
path_str = (
|
|
162
|
+
agent_info.get("path")
|
|
163
|
+
or agent_info.get("file_path")
|
|
164
|
+
or agent_info.get("source_file")
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
if path_str:
|
|
168
|
+
filename = Path(path_str).stem
|
|
169
|
+
canonical_id = f"legacy:{filename}"
|
|
170
|
+
else:
|
|
171
|
+
canonical_id = f"legacy:{agent_name}"
|
|
172
|
+
|
|
173
|
+
# Cache it
|
|
174
|
+
agent_info["canonical_id"] = canonical_id
|
|
175
|
+
return canonical_id
|
|
176
|
+
|
|
44
177
|
def discover_agents_from_all_sources(
|
|
45
178
|
self,
|
|
46
179
|
system_templates_dir: Optional[Path] = None,
|
|
47
180
|
project_agents_dir: Optional[Path] = None,
|
|
48
181
|
user_agents_dir: Optional[Path] = None,
|
|
182
|
+
agents_cache_dir: Optional[Path] = None,
|
|
49
183
|
working_directory: Optional[Path] = None,
|
|
50
184
|
) -> Dict[str, List[Dict[str, Any]]]:
|
|
51
|
-
"""Discover agents from all
|
|
185
|
+
"""Discover agents from all 4 tiers (system, user, cache, project).
|
|
186
|
+
|
|
187
|
+
Priority hierarchy (highest to lowest):
|
|
188
|
+
4. Project agents - Highest priority, project-specific customizations
|
|
189
|
+
3. Cached agents - GitHub-synced agents from cache
|
|
190
|
+
2. User agents - DEPRECATED, user-level customizations
|
|
191
|
+
1. System templates - Lowest priority, built-in agents
|
|
52
192
|
|
|
53
193
|
Args:
|
|
54
194
|
system_templates_dir: Directory containing system agent templates
|
|
55
195
|
project_agents_dir: Directory containing project-specific agents
|
|
56
|
-
user_agents_dir: Directory containing user custom agents
|
|
196
|
+
user_agents_dir: Directory containing user custom agents (DEPRECATED)
|
|
197
|
+
agents_cache_dir: Directory containing cached agents from Git sources
|
|
57
198
|
working_directory: Current working directory for finding project agents
|
|
58
199
|
|
|
59
200
|
Returns:
|
|
60
201
|
Dictionary mapping agent names to list of agent info from different sources
|
|
202
|
+
|
|
203
|
+
Deprecation Warning:
|
|
204
|
+
User-level agents are deprecated and will show a warning if found.
|
|
205
|
+
Use 'claude-mpm agents migrate-to-project' to migrate them.
|
|
61
206
|
"""
|
|
62
207
|
agents_by_name = {}
|
|
63
208
|
|
|
@@ -80,24 +225,53 @@ class MultiSourceAgentDeploymentService:
|
|
|
80
225
|
if not user_agents_dir.exists():
|
|
81
226
|
user_agents_dir = None
|
|
82
227
|
|
|
83
|
-
|
|
228
|
+
if not agents_cache_dir:
|
|
229
|
+
# Check for agents in cache directory
|
|
230
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache"
|
|
231
|
+
agents_cache_dir = cache_dir / "agents"
|
|
232
|
+
if not agents_cache_dir.exists():
|
|
233
|
+
agents_cache_dir = None
|
|
234
|
+
|
|
235
|
+
# Discover agents from each source in priority order
|
|
236
|
+
# Note: We process in reverse priority order (system first) and build up the dictionary
|
|
237
|
+
# The select_highest_version_agents() method will handle the actual prioritization
|
|
84
238
|
sources = [
|
|
85
239
|
("system", system_templates_dir),
|
|
86
|
-
("project", project_agents_dir),
|
|
87
240
|
("user", user_agents_dir),
|
|
241
|
+
("remote", agents_cache_dir),
|
|
242
|
+
("project", project_agents_dir),
|
|
88
243
|
]
|
|
89
244
|
|
|
245
|
+
# Track if we found user agents for deprecation warning
|
|
246
|
+
user_agents_found = False
|
|
247
|
+
|
|
90
248
|
for source_name, source_dir in sources:
|
|
91
249
|
if source_dir and source_dir.exists():
|
|
92
250
|
self.logger.debug(
|
|
93
251
|
f"Discovering agents from {source_name} source: {source_dir}"
|
|
94
252
|
)
|
|
95
|
-
|
|
96
|
-
#
|
|
97
|
-
|
|
253
|
+
|
|
254
|
+
# Use appropriate discovery service based on source type
|
|
255
|
+
if source_name == "remote":
|
|
256
|
+
# Remote agents are Markdown, use RemoteAgentDiscoveryService
|
|
257
|
+
remote_service = RemoteAgentDiscoveryService(source_dir)
|
|
258
|
+
agents = remote_service.discover_remote_agents()
|
|
259
|
+
else:
|
|
260
|
+
# Other sources are JSON, use AgentDiscoveryService
|
|
261
|
+
discovery_service = AgentDiscoveryService(source_dir)
|
|
262
|
+
# Pass log_discovery=False to avoid duplicate logging
|
|
263
|
+
agents = discovery_service.list_available_agents(
|
|
264
|
+
log_discovery=False
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
# Track user agents for deprecation warning
|
|
268
|
+
if source_name == "user" and agents:
|
|
269
|
+
user_agents_found = True
|
|
98
270
|
|
|
99
271
|
for agent_info in agents:
|
|
100
|
-
agent_name = agent_info.get("name")
|
|
272
|
+
agent_name = agent_info.get("name") or agent_info.get(
|
|
273
|
+
"metadata", {}
|
|
274
|
+
).get("name")
|
|
101
275
|
if not agent_name:
|
|
102
276
|
continue
|
|
103
277
|
|
|
@@ -105,19 +279,87 @@ class MultiSourceAgentDeploymentService:
|
|
|
105
279
|
agent_info["source"] = source_name
|
|
106
280
|
agent_info["source_dir"] = str(source_dir)
|
|
107
281
|
|
|
282
|
+
# NEW: Build canonical_id for enhanced matching
|
|
283
|
+
canonical_id = self._build_canonical_id_for_agent(agent_info)
|
|
284
|
+
|
|
285
|
+
# Group by canonical_id (PRIMARY) for enhanced matching
|
|
286
|
+
# This allows matching agents from different sources with same canonical_id
|
|
287
|
+
# while maintaining backward compatibility with name-based matching
|
|
288
|
+
matching_key = canonical_id
|
|
289
|
+
|
|
108
290
|
# Initialize list if this is the first occurrence of this agent
|
|
109
|
-
if
|
|
110
|
-
agents_by_name[
|
|
291
|
+
if matching_key not in agents_by_name:
|
|
292
|
+
agents_by_name[matching_key] = []
|
|
111
293
|
|
|
112
|
-
agents_by_name[
|
|
294
|
+
agents_by_name[matching_key].append(agent_info)
|
|
113
295
|
|
|
114
296
|
# Use more specific log message
|
|
115
297
|
self.logger.info(
|
|
116
298
|
f"Discovered {len(agents)} {source_name} agent templates from {source_dir.name}"
|
|
117
299
|
)
|
|
118
300
|
|
|
301
|
+
# Show deprecation warning if user agents found
|
|
302
|
+
if user_agents_found:
|
|
303
|
+
self.logger.warning(
|
|
304
|
+
"\n"
|
|
305
|
+
"⚠️ DEPRECATION WARNING: User-level agents found in ~/.claude-mpm/agents/\n"
|
|
306
|
+
" User-level agent deployment is deprecated and will be removed in v5.0.0\n"
|
|
307
|
+
"\n"
|
|
308
|
+
" Why this change?\n"
|
|
309
|
+
" - Project isolation: Agents should be project-specific\n"
|
|
310
|
+
" - Version control: Project agents can be versioned with your code\n"
|
|
311
|
+
" - Team consistency: All team members use the same agents\n"
|
|
312
|
+
"\n"
|
|
313
|
+
" Migration:\n"
|
|
314
|
+
" 1. Run: claude-mpm agents migrate-to-project\n"
|
|
315
|
+
" 2. Verify agents work in .claude-mpm/agents/\n"
|
|
316
|
+
" 3. Remove: rm -rf ~/.claude-mpm/agents/\n"
|
|
317
|
+
"\n"
|
|
318
|
+
" Learn more: https://docs.claude-mpm.dev/agents/migration\n"
|
|
319
|
+
)
|
|
320
|
+
|
|
119
321
|
return agents_by_name
|
|
120
322
|
|
|
323
|
+
def get_agents_by_collection(
|
|
324
|
+
self,
|
|
325
|
+
collection_id: str,
|
|
326
|
+
agents_cache_dir: Optional[Path] = None,
|
|
327
|
+
) -> List[Dict[str, Any]]:
|
|
328
|
+
"""Get all agents from a specific collection.
|
|
329
|
+
|
|
330
|
+
NEW: Enables collection-based agent selection.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
collection_id: Collection identifier (e.g., "bobmatnyc/claude-mpm-agents")
|
|
334
|
+
agents_cache_dir: Directory containing agents cache
|
|
335
|
+
|
|
336
|
+
Returns:
|
|
337
|
+
List of agent dictionaries from the specified collection
|
|
338
|
+
|
|
339
|
+
Example:
|
|
340
|
+
>>> service = MultiSourceAgentDeploymentService()
|
|
341
|
+
>>> agents = service.get_agents_by_collection("bobmatnyc/claude-mpm-agents")
|
|
342
|
+
>>> len(agents)
|
|
343
|
+
45
|
|
344
|
+
"""
|
|
345
|
+
if not agents_cache_dir:
|
|
346
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache"
|
|
347
|
+
agents_cache_dir = cache_dir / "agents"
|
|
348
|
+
|
|
349
|
+
if not agents_cache_dir.exists():
|
|
350
|
+
self.logger.warning(f"Agents cache directory not found: {agents_cache_dir}")
|
|
351
|
+
return []
|
|
352
|
+
|
|
353
|
+
# Use RemoteAgentDiscoveryService to get collection agents
|
|
354
|
+
remote_service = RemoteAgentDiscoveryService(agents_cache_dir)
|
|
355
|
+
collection_agents = remote_service.get_agents_by_collection(collection_id)
|
|
356
|
+
|
|
357
|
+
self.logger.info(
|
|
358
|
+
f"Retrieved {len(collection_agents)} agents from collection '{collection_id}'"
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
return collection_agents
|
|
362
|
+
|
|
121
363
|
def select_highest_version_agents(
|
|
122
364
|
self, agents_by_name: Dict[str, List[Dict[str, Any]]]
|
|
123
365
|
) -> Dict[str, Dict[str, Any]]:
|
|
@@ -226,17 +468,19 @@ class MultiSourceAgentDeploymentService:
|
|
|
226
468
|
system_templates_dir: Optional[Path] = None,
|
|
227
469
|
project_agents_dir: Optional[Path] = None,
|
|
228
470
|
user_agents_dir: Optional[Path] = None,
|
|
471
|
+
agents_cache_dir: Optional[Path] = None,
|
|
229
472
|
working_directory: Optional[Path] = None,
|
|
230
473
|
excluded_agents: Optional[List[str]] = None,
|
|
231
474
|
config: Optional[Config] = None,
|
|
232
475
|
cleanup_outdated: bool = True,
|
|
233
476
|
) -> Tuple[Dict[str, Path], Dict[str, str], Dict[str, Any]]:
|
|
234
|
-
"""Get the highest version agents from all
|
|
477
|
+
"""Get the highest version agents from all 4 tiers for deployment.
|
|
235
478
|
|
|
236
479
|
Args:
|
|
237
480
|
system_templates_dir: Directory containing system agent templates
|
|
238
481
|
project_agents_dir: Directory containing project-specific agents
|
|
239
|
-
user_agents_dir: Directory containing user custom agents
|
|
482
|
+
user_agents_dir: Directory containing user custom agents (DEPRECATED)
|
|
483
|
+
agents_cache_dir: Directory containing cached agents from Git sources
|
|
240
484
|
working_directory: Current working directory for finding project agents
|
|
241
485
|
excluded_agents: List of agent names to exclude from deployment
|
|
242
486
|
config: Configuration object for additional filtering
|
|
@@ -248,11 +492,12 @@ class MultiSourceAgentDeploymentService:
|
|
|
248
492
|
- Dictionary mapping agent names to their source
|
|
249
493
|
- Dictionary with cleanup results (removed, preserved, errors)
|
|
250
494
|
"""
|
|
251
|
-
# Discover all available agents
|
|
495
|
+
# Discover all available agents from 4 tiers
|
|
252
496
|
agents_by_name = self.discover_agents_from_all_sources(
|
|
253
497
|
system_templates_dir=system_templates_dir,
|
|
254
498
|
project_agents_dir=project_agents_dir,
|
|
255
499
|
user_agents_dir=user_agents_dir,
|
|
500
|
+
agents_cache_dir=agents_cache_dir,
|
|
256
501
|
working_directory=working_directory,
|
|
257
502
|
)
|
|
258
503
|
|
|
@@ -286,10 +531,28 @@ class MultiSourceAgentDeploymentService:
|
|
|
286
531
|
|
|
287
532
|
# Apply exclusion filters
|
|
288
533
|
if excluded_agents:
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
534
|
+
# Find agents to remove by matching name field or agent_id portion of canonical_id
|
|
535
|
+
agents_to_remove = []
|
|
536
|
+
excluded_set = {name.lower() for name in excluded_agents}
|
|
537
|
+
|
|
538
|
+
for canonical_id, agent_info in list(selected_agents.items()):
|
|
539
|
+
# Check agent name field
|
|
540
|
+
agent_name = agent_info.get("name", "").lower()
|
|
541
|
+
|
|
542
|
+
# Also check the agent_id portion of canonical_id (after the colon)
|
|
543
|
+
# Example: "bobmatnyc/claude-mpm-agents:pm" -> "pm"
|
|
544
|
+
agent_id = canonical_id.split(":")[-1].lower() if ":" in canonical_id else canonical_id.lower()
|
|
545
|
+
|
|
546
|
+
if agent_name in excluded_set or agent_id in excluded_set:
|
|
547
|
+
agents_to_remove.append(canonical_id)
|
|
548
|
+
self.logger.info(
|
|
549
|
+
f"Excluding agent '{agent_info.get('name', agent_id)}' "
|
|
550
|
+
f"(canonical_id: {canonical_id}) from deployment"
|
|
551
|
+
)
|
|
552
|
+
|
|
553
|
+
# Remove matched agents
|
|
554
|
+
for canonical_id in agents_to_remove:
|
|
555
|
+
del selected_agents[canonical_id]
|
|
293
556
|
|
|
294
557
|
# Apply config-based filtering if provided
|
|
295
558
|
if config:
|
|
@@ -300,7 +563,21 @@ class MultiSourceAgentDeploymentService:
|
|
|
300
563
|
agent_sources = {}
|
|
301
564
|
|
|
302
565
|
for agent_name, agent_info in selected_agents.items():
|
|
303
|
-
|
|
566
|
+
# Defensive: Try multiple path fields for backward compatibility (ticket 1M-480)
|
|
567
|
+
# Priority: 'path' -> 'file_path' -> 'source_file'
|
|
568
|
+
path_str = (
|
|
569
|
+
agent_info.get("path")
|
|
570
|
+
or agent_info.get("file_path")
|
|
571
|
+
or agent_info.get("source_file")
|
|
572
|
+
)
|
|
573
|
+
|
|
574
|
+
if not path_str:
|
|
575
|
+
self.logger.warning(
|
|
576
|
+
f"Agent '{agent_name}' missing path information (no 'path', 'file_path', or 'source_file' field)"
|
|
577
|
+
)
|
|
578
|
+
continue
|
|
579
|
+
|
|
580
|
+
template_path = Path(path_str)
|
|
304
581
|
if template_path.exists():
|
|
305
582
|
# Use the file stem as the key for consistency
|
|
306
583
|
file_stem = template_path.stem
|
|
@@ -324,6 +601,105 @@ class MultiSourceAgentDeploymentService:
|
|
|
324
601
|
|
|
325
602
|
return agents_to_deploy, agent_sources, cleanup_results
|
|
326
603
|
|
|
604
|
+
def cleanup_excluded_agents(
|
|
605
|
+
self,
|
|
606
|
+
deployed_agents_dir: Path,
|
|
607
|
+
agents_to_deploy: Dict[str, Path],
|
|
608
|
+
) -> Dict[str, Any]:
|
|
609
|
+
"""Remove agents from deployed directory that aren't in the deployment list.
|
|
610
|
+
|
|
611
|
+
Similar to skill cleanup logic, this removes agents that were previously
|
|
612
|
+
deployed but are no longer in the enabled agents list (e.g., filtered out
|
|
613
|
+
by profile configuration).
|
|
614
|
+
|
|
615
|
+
Args:
|
|
616
|
+
deployed_agents_dir: Directory containing deployed agents (~/.claude/agents)
|
|
617
|
+
agents_to_deploy: Dictionary mapping agent file stems to template paths
|
|
618
|
+
|
|
619
|
+
Returns:
|
|
620
|
+
Dictionary with cleanup results:
|
|
621
|
+
- removed: List of removed agent names
|
|
622
|
+
- errors: List of errors during cleanup
|
|
623
|
+
"""
|
|
624
|
+
cleanup_results = {"removed": [], "errors": []}
|
|
625
|
+
|
|
626
|
+
# Safety check - only operate on deployed agents directory
|
|
627
|
+
if not deployed_agents_dir.exists():
|
|
628
|
+
self.logger.debug("Deployed agents directory does not exist, no cleanup needed")
|
|
629
|
+
return cleanup_results
|
|
630
|
+
|
|
631
|
+
# Build set of agent names that should exist (file stems without .md extension)
|
|
632
|
+
expected_agents = set(agents_to_deploy.keys())
|
|
633
|
+
|
|
634
|
+
try:
|
|
635
|
+
# Check each file in deployed_agents_dir
|
|
636
|
+
for item in deployed_agents_dir.iterdir():
|
|
637
|
+
# Only process .md files
|
|
638
|
+
if not item.is_file() or item.suffix != ".md":
|
|
639
|
+
continue
|
|
640
|
+
|
|
641
|
+
# Skip hidden files
|
|
642
|
+
if item.name.startswith("."):
|
|
643
|
+
continue
|
|
644
|
+
|
|
645
|
+
# Get agent name (file stem)
|
|
646
|
+
agent_name = item.stem
|
|
647
|
+
|
|
648
|
+
# Check if this agent should be kept
|
|
649
|
+
if agent_name not in expected_agents:
|
|
650
|
+
try:
|
|
651
|
+
# Security: Validate path is within deployed_agents_dir
|
|
652
|
+
resolved_item = item.resolve()
|
|
653
|
+
resolved_target = deployed_agents_dir.resolve()
|
|
654
|
+
|
|
655
|
+
if not str(resolved_item).startswith(str(resolved_target)):
|
|
656
|
+
self.logger.error(
|
|
657
|
+
f"Refusing to remove path outside target directory: {item}"
|
|
658
|
+
)
|
|
659
|
+
cleanup_results["errors"].append(
|
|
660
|
+
{
|
|
661
|
+
"agent": agent_name,
|
|
662
|
+
"error": "Path outside target directory",
|
|
663
|
+
}
|
|
664
|
+
)
|
|
665
|
+
continue
|
|
666
|
+
|
|
667
|
+
# Remove the agent file
|
|
668
|
+
item.unlink()
|
|
669
|
+
cleanup_results["removed"].append(agent_name)
|
|
670
|
+
self.logger.info(f"Removed excluded agent: {agent_name}")
|
|
671
|
+
|
|
672
|
+
except PermissionError as e:
|
|
673
|
+
error_msg = f"Permission denied removing {agent_name}: {e}"
|
|
674
|
+
self.logger.error(error_msg)
|
|
675
|
+
cleanup_results["errors"].append(
|
|
676
|
+
{"agent": agent_name, "error": error_msg}
|
|
677
|
+
)
|
|
678
|
+
except Exception as e:
|
|
679
|
+
error_msg = f"Error removing {agent_name}: {e}"
|
|
680
|
+
self.logger.error(error_msg)
|
|
681
|
+
cleanup_results["errors"].append(
|
|
682
|
+
{"agent": agent_name, "error": error_msg}
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
except Exception as e:
|
|
686
|
+
self.logger.error(f"Error during agent cleanup: {e}")
|
|
687
|
+
cleanup_results["errors"].append(
|
|
688
|
+
{"agent": "cleanup_process", "error": str(e)}
|
|
689
|
+
)
|
|
690
|
+
|
|
691
|
+
# Log cleanup summary
|
|
692
|
+
if cleanup_results["removed"]:
|
|
693
|
+
self.logger.info(
|
|
694
|
+
f"Cleanup complete: removed {len(cleanup_results['removed'])} excluded agents"
|
|
695
|
+
)
|
|
696
|
+
if cleanup_results["errors"]:
|
|
697
|
+
self.logger.warning(
|
|
698
|
+
f"Encountered {len(cleanup_results['errors'])} errors during cleanup"
|
|
699
|
+
)
|
|
700
|
+
|
|
701
|
+
return cleanup_results
|
|
702
|
+
|
|
327
703
|
def cleanup_outdated_user_agents(
|
|
328
704
|
self,
|
|
329
705
|
agents_by_name: Dict[str, List[Dict[str, Any]]],
|
|
@@ -371,8 +747,20 @@ class MultiSourceAgentDeploymentService:
|
|
|
371
747
|
if agent_info["source"] != "user":
|
|
372
748
|
continue
|
|
373
749
|
|
|
750
|
+
# Defensive: Get path from agent_info (ticket 1M-480)
|
|
751
|
+
path_str = (
|
|
752
|
+
agent_info.get("path")
|
|
753
|
+
or agent_info.get("file_path")
|
|
754
|
+
or agent_info.get("source_file")
|
|
755
|
+
)
|
|
756
|
+
if not path_str:
|
|
757
|
+
self.logger.warning(
|
|
758
|
+
f"User agent '{agent_name}' missing path information, skipping cleanup"
|
|
759
|
+
)
|
|
760
|
+
continue
|
|
761
|
+
|
|
374
762
|
# Safety check - ensure path is within user agents directory
|
|
375
|
-
user_agent_path = Path(
|
|
763
|
+
user_agent_path = Path(path_str)
|
|
376
764
|
try:
|
|
377
765
|
# Resolve paths to compare them safely
|
|
378
766
|
resolved_user_path = user_agent_path.resolve()
|
|
@@ -620,17 +1008,20 @@ class MultiSourceAgentDeploymentService:
|
|
|
620
1008
|
comparison_results["needs_update"].append(agent_name)
|
|
621
1009
|
continue
|
|
622
1010
|
|
|
623
|
-
# Read template version
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
template_data.get("agent_version")
|
|
629
|
-
or template_data.get("version")
|
|
630
|
-
or metadata.get("version", "0.0.0")
|
|
1011
|
+
# Read template version using format-aware helper
|
|
1012
|
+
version_string = self._read_template_version(template_path)
|
|
1013
|
+
if not version_string:
|
|
1014
|
+
self.logger.warning(
|
|
1015
|
+
f"Could not extract version from template for '{agent_name}', skipping"
|
|
631
1016
|
)
|
|
1017
|
+
continue
|
|
1018
|
+
|
|
1019
|
+
try:
|
|
1020
|
+
template_version = self.version_manager.parse_version(version_string)
|
|
632
1021
|
except Exception as e:
|
|
633
|
-
self.logger.warning(
|
|
1022
|
+
self.logger.warning(
|
|
1023
|
+
f"Error parsing version '{version_string}' for '{agent_name}': {e}"
|
|
1024
|
+
)
|
|
634
1025
|
continue
|
|
635
1026
|
|
|
636
1027
|
# Read deployed version
|
|
@@ -51,11 +51,11 @@ class DeploymentPipelineExecutor:
|
|
|
51
51
|
try:
|
|
52
52
|
# Check if step should be executed
|
|
53
53
|
if not step.should_execute(context):
|
|
54
|
-
self.logger.info(f"Skipping step {i+1}/{len(steps)}: {step.name}")
|
|
54
|
+
self.logger.info(f"Skipping step {i + 1}/{len(steps)}: {step.name}")
|
|
55
55
|
skipped_steps.append(step.name)
|
|
56
56
|
continue
|
|
57
57
|
|
|
58
|
-
self.logger.info(f"Executing step {i+1}/{len(steps)}: {step.name}")
|
|
58
|
+
self.logger.info(f"Executing step {i + 1}/{len(steps)}: {step.name}")
|
|
59
59
|
|
|
60
60
|
# Execute the step
|
|
61
61
|
result = step.execute(context)
|
|
@@ -9,10 +9,7 @@ from claude_mpm.core.logger import get_logger
|
|
|
9
9
|
|
|
10
10
|
from .config import DeploymentConfigManager
|
|
11
11
|
from .facade import DeploymentFacade
|
|
12
|
-
from .pipeline import
|
|
13
|
-
DeploymentPipelineBuilder,
|
|
14
|
-
DeploymentPipelineExecutor,
|
|
15
|
-
)
|
|
12
|
+
from .pipeline import DeploymentPipelineBuilder, DeploymentPipelineExecutor
|
|
16
13
|
from .results import DeploymentResultBuilder
|
|
17
14
|
|
|
18
15
|
# Import refactored components
|