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
|
@@ -103,6 +103,10 @@ class AgentMetadata:
|
|
|
103
103
|
author: Optional[str] = None
|
|
104
104
|
tags: List[str] = field(default_factory=list)
|
|
105
105
|
specializations: List[str] = field(default_factory=list)
|
|
106
|
+
# NEW: Collection metadata for enhanced agent matching
|
|
107
|
+
collection_id: Optional[str] = None # Format: owner/repo-name
|
|
108
|
+
source_path: Optional[str] = None # Relative path in repository
|
|
109
|
+
canonical_id: Optional[str] = None # Format: collection_id:agent_id
|
|
106
110
|
|
|
107
111
|
def increment_serial_version(self) -> None:
|
|
108
112
|
"""Increment the patch version number.
|
|
@@ -181,6 +185,9 @@ class AgentDefinition:
|
|
|
181
185
|
"author": self.metadata.author,
|
|
182
186
|
"tags": self.metadata.tags,
|
|
183
187
|
"specializations": self.metadata.specializations,
|
|
188
|
+
"collection_id": self.metadata.collection_id,
|
|
189
|
+
"source_path": self.metadata.source_path,
|
|
190
|
+
"canonical_id": self.metadata.canonical_id,
|
|
184
191
|
},
|
|
185
192
|
"primary_role": self.primary_role,
|
|
186
193
|
"when_to_use": self.when_to_use,
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""Git repository model for agent sources."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Optional
|
|
7
|
+
from urllib.parse import urlparse
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class GitRepository:
|
|
12
|
+
"""Represents a Git repository configuration for agent sources.
|
|
13
|
+
|
|
14
|
+
This model tracks Git repositories that contain agent markdown files.
|
|
15
|
+
Repositories are cached locally and synced using ETag-based HTTP caching.
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
18
|
+
url: Full GitHub repository URL (e.g., https://github.com/owner/repo)
|
|
19
|
+
subdirectory: Optional subdirectory within repository (e.g., "agents/backend")
|
|
20
|
+
enabled: Whether this repository should be synced
|
|
21
|
+
priority: Priority for agent resolution (lower = higher precedence)
|
|
22
|
+
last_synced: Timestamp of last successful sync
|
|
23
|
+
etag: HTTP ETag from last sync for incremental updates
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
url: str
|
|
27
|
+
subdirectory: Optional[str] = None
|
|
28
|
+
enabled: bool = True
|
|
29
|
+
priority: int = 100
|
|
30
|
+
last_synced: Optional[datetime] = None
|
|
31
|
+
etag: Optional[str] = None
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def cache_path(self) -> Path:
|
|
35
|
+
"""Return cache directory path for this repository.
|
|
36
|
+
|
|
37
|
+
Cache structure: ~/.claude-mpm/cache/agents/{owner}/{repo}/{subdirectory}/
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Absolute path to cache directory for this repository
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
>>> repo = GitRepository(
|
|
44
|
+
... url="https://github.com/bobmatnyc/claude-mpm-agents",
|
|
45
|
+
... subdirectory="agents"
|
|
46
|
+
... )
|
|
47
|
+
>>> repo.cache_path
|
|
48
|
+
Path('/Users/user/.claude-mpm/cache/agents/bobmatnyc/claude-mpm-agents/agents')
|
|
49
|
+
"""
|
|
50
|
+
home = Path.home()
|
|
51
|
+
base_cache = home / ".claude-mpm" / "cache" / "agents"
|
|
52
|
+
|
|
53
|
+
# Extract owner and repo from URL
|
|
54
|
+
owner, repo = self._parse_github_url(self.url)
|
|
55
|
+
|
|
56
|
+
# Build cache path: base/owner/repo/subdirectory
|
|
57
|
+
cache_path = base_cache / owner / repo
|
|
58
|
+
|
|
59
|
+
if self.subdirectory:
|
|
60
|
+
# Normalize subdirectory path (remove leading/trailing slashes)
|
|
61
|
+
normalized_subdir = self.subdirectory.strip("/")
|
|
62
|
+
cache_path = cache_path / normalized_subdir
|
|
63
|
+
|
|
64
|
+
return cache_path
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def identifier(self) -> str:
|
|
68
|
+
"""Return unique identifier for this repository.
|
|
69
|
+
|
|
70
|
+
Format: {owner}/{repo}/{subdirectory} or {owner}/{repo}
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Unique identifier string
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
>>> repo = GitRepository(
|
|
77
|
+
... url="https://github.com/owner/repo",
|
|
78
|
+
... subdirectory="agents"
|
|
79
|
+
... )
|
|
80
|
+
>>> repo.identifier
|
|
81
|
+
'owner/repo/agents'
|
|
82
|
+
"""
|
|
83
|
+
owner, repo = self._parse_github_url(self.url)
|
|
84
|
+
base_id = f"{owner}/{repo}"
|
|
85
|
+
|
|
86
|
+
if self.subdirectory:
|
|
87
|
+
normalized_subdir = self.subdirectory.strip("/")
|
|
88
|
+
return f"{base_id}/{normalized_subdir}"
|
|
89
|
+
|
|
90
|
+
return base_id
|
|
91
|
+
|
|
92
|
+
def validate(self) -> list[str]:
|
|
93
|
+
"""Validate repository configuration.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
List of validation error messages (empty if valid)
|
|
97
|
+
|
|
98
|
+
Validation checks:
|
|
99
|
+
- URL is not empty
|
|
100
|
+
- URL is valid HTTP/HTTPS format
|
|
101
|
+
- URL is a GitHub repository URL
|
|
102
|
+
- Priority is non-negative
|
|
103
|
+
- Priority is reasonable (<= 1000, warning only)
|
|
104
|
+
- Subdirectory is relative path (not absolute)
|
|
105
|
+
"""
|
|
106
|
+
errors = []
|
|
107
|
+
|
|
108
|
+
# Validate URL
|
|
109
|
+
if not self.url or not self.url.strip():
|
|
110
|
+
errors.append("URL cannot be empty")
|
|
111
|
+
return errors # Can't continue validation without URL
|
|
112
|
+
|
|
113
|
+
# Check URL format
|
|
114
|
+
try:
|
|
115
|
+
parsed = urlparse(self.url)
|
|
116
|
+
|
|
117
|
+
# Must be HTTP or HTTPS
|
|
118
|
+
if parsed.scheme not in ("http", "https"):
|
|
119
|
+
errors.append(
|
|
120
|
+
f"URL must use http:// or https:// protocol, got: {parsed.scheme}"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# Must be GitHub (for now)
|
|
124
|
+
if not parsed.netloc.endswith("github.com"):
|
|
125
|
+
errors.append(f"URL must be a GitHub repository, got: {parsed.netloc}")
|
|
126
|
+
|
|
127
|
+
# Should have owner/repo path structure
|
|
128
|
+
path_parts = [p for p in parsed.path.strip("/").split("/") if p]
|
|
129
|
+
if len(path_parts) < 2:
|
|
130
|
+
errors.append(f"URL must include owner/repo path, got: {parsed.path}")
|
|
131
|
+
|
|
132
|
+
except Exception as e:
|
|
133
|
+
errors.append(f"Invalid URL format: {e}")
|
|
134
|
+
|
|
135
|
+
# Validate priority
|
|
136
|
+
if self.priority < 0:
|
|
137
|
+
errors.append("Priority must be non-negative (0 or greater)")
|
|
138
|
+
|
|
139
|
+
if self.priority > 1000:
|
|
140
|
+
errors.append(
|
|
141
|
+
f"Priority {self.priority} is unusually high (recommended: 0-1000). "
|
|
142
|
+
"Lower priority numbers have higher precedence."
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# Validate subdirectory
|
|
146
|
+
if self.subdirectory:
|
|
147
|
+
# Must be relative path
|
|
148
|
+
if Path(self.subdirectory).is_absolute():
|
|
149
|
+
errors.append(
|
|
150
|
+
f"Subdirectory must be a relative path, got absolute: {self.subdirectory}"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Should not start with slash
|
|
154
|
+
if self.subdirectory.startswith("/"):
|
|
155
|
+
errors.append(
|
|
156
|
+
f"Subdirectory should not start with '/', got: {self.subdirectory}"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
return errors
|
|
160
|
+
|
|
161
|
+
def _parse_github_url(self, url: str) -> tuple[str, str]:
|
|
162
|
+
"""Parse GitHub URL to extract owner and repository name.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
url: GitHub repository URL
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Tuple of (owner, repository_name)
|
|
169
|
+
|
|
170
|
+
Example:
|
|
171
|
+
>>> repo = GitRepository(url="https://github.com/owner/repo")
|
|
172
|
+
>>> repo._parse_github_url(repo.url)
|
|
173
|
+
('owner', 'repo')
|
|
174
|
+
"""
|
|
175
|
+
# Remove .git suffix if present
|
|
176
|
+
url = url.rstrip("/")
|
|
177
|
+
if url.endswith(".git"):
|
|
178
|
+
url = url[:-4]
|
|
179
|
+
|
|
180
|
+
# Parse URL
|
|
181
|
+
parsed = urlparse(url)
|
|
182
|
+
path_parts = [p for p in parsed.path.strip("/").split("/") if p]
|
|
183
|
+
|
|
184
|
+
if len(path_parts) >= 2:
|
|
185
|
+
owner = path_parts[0]
|
|
186
|
+
repo = path_parts[1]
|
|
187
|
+
return owner, repo
|
|
188
|
+
|
|
189
|
+
# Fallback: Use URL as-is if parsing fails
|
|
190
|
+
# This will be caught by validation
|
|
191
|
+
return "unknown", "unknown"
|
|
192
|
+
|
|
193
|
+
def __repr__(self) -> str:
|
|
194
|
+
"""Return string representation of repository."""
|
|
195
|
+
return (
|
|
196
|
+
f"GitRepository(identifier='{self.identifier}', "
|
|
197
|
+
f"priority={self.priority}, enabled={self.enabled})"
|
|
198
|
+
)
|
|
@@ -88,18 +88,21 @@ fi
|
|
|
88
88
|
#
|
|
89
89
|
# STRATEGY:
|
|
90
90
|
# This function implements a fallback chain to find Python with claude-mpm dependencies:
|
|
91
|
-
# 1.
|
|
92
|
-
# 2.
|
|
93
|
-
# 3.
|
|
94
|
-
# 4.
|
|
91
|
+
# 1. UV-managed projects (uv.lock detected) - uses "uv run python"
|
|
92
|
+
# 2. pipx installations - uses pipx venv Python
|
|
93
|
+
# 3. Project-specific virtual environments (venv, .venv)
|
|
94
|
+
# 4. Currently active virtual environment ($VIRTUAL_ENV)
|
|
95
|
+
# 5. System python3 (may lack dependencies)
|
|
96
|
+
# 6. System python (last resort)
|
|
95
97
|
#
|
|
96
98
|
# WHY THIS APPROACH:
|
|
97
99
|
# - Claude MPM requires specific packages (socketio, eventlet) not in system Python
|
|
98
|
-
# -
|
|
100
|
+
# - UV and virtual environments ensure dependency isolation and availability
|
|
99
101
|
# - Multiple naming conventions supported (venv vs .venv)
|
|
100
102
|
# - Graceful degradation to system Python if no venv found
|
|
101
103
|
#
|
|
102
104
|
# ACTIVATION STRATEGY:
|
|
105
|
+
# - UV projects: use "uv run python" to execute in UV-managed environment
|
|
103
106
|
# - Sources activate script to set up environment variables
|
|
104
107
|
# - Returns specific Python path for exec (not just 'python')
|
|
105
108
|
# - Maintains environment in same shell process
|
|
@@ -110,10 +113,18 @@ fi
|
|
|
110
113
|
# - Caches result in process environment
|
|
111
114
|
#
|
|
112
115
|
# RETURNS:
|
|
113
|
-
# Absolute path to Python executable with claude-mpm dependencies
|
|
116
|
+
# Absolute path to Python executable with claude-mpm dependencies, or "uv run python" for UV projects
|
|
114
117
|
#
|
|
115
118
|
find_python_command() {
|
|
116
|
-
# 1. Check
|
|
119
|
+
# 1. Check for UV project first (uv.lock or pyproject.toml with uv)
|
|
120
|
+
if [ -f "$CLAUDE_MPM_ROOT/uv.lock" ]; then
|
|
121
|
+
if command -v uv &> /dev/null; then
|
|
122
|
+
echo "uv run python"
|
|
123
|
+
return
|
|
124
|
+
fi
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# 2. Check if we're in a pipx installation
|
|
117
128
|
if [[ "$SCRIPT_DIR" == *"/.local/pipx/venvs/claude-mpm/"* ]]; then
|
|
118
129
|
# pipx installation - use the pipx venv's Python directly
|
|
119
130
|
if [ -f "$CLAUDE_MPM_ROOT/bin/python" ]; then
|
|
@@ -121,8 +132,8 @@ find_python_command() {
|
|
|
121
132
|
return
|
|
122
133
|
fi
|
|
123
134
|
fi
|
|
124
|
-
|
|
125
|
-
#
|
|
135
|
+
|
|
136
|
+
# 3. Check for project-local virtual environment (common in development)
|
|
126
137
|
if [ -f "$CLAUDE_MPM_ROOT/venv/bin/activate" ]; then
|
|
127
138
|
source "$CLAUDE_MPM_ROOT/venv/bin/activate"
|
|
128
139
|
echo "$CLAUDE_MPM_ROOT/venv/bin/python"
|
|
@@ -152,7 +163,7 @@ if [[ "$SCRIPT_DIR" == *"/.local/pipx/venvs/claude-mpm/"* ]]; then
|
|
|
152
163
|
elif [ -d "$CLAUDE_MPM_ROOT/src" ]; then
|
|
153
164
|
# Development install - add src to PYTHONPATH
|
|
154
165
|
export PYTHONPATH="$CLAUDE_MPM_ROOT/src:$PYTHONPATH"
|
|
155
|
-
|
|
166
|
+
|
|
156
167
|
if [ "${CLAUDE_MPM_HOOK_DEBUG}" = "true" ]; then
|
|
157
168
|
echo "[$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)] Development environment detected" >> /tmp/claude-mpm-hook.log
|
|
158
169
|
fi
|
|
@@ -173,15 +184,44 @@ fi
|
|
|
173
184
|
# Set Socket.IO configuration for hook events
|
|
174
185
|
export CLAUDE_MPM_SOCKETIO_PORT="${CLAUDE_MPM_SOCKETIO_PORT:-8765}"
|
|
175
186
|
|
|
176
|
-
#
|
|
177
|
-
|
|
178
|
-
if ! exec "$PYTHON_CMD" -m claude_mpm.hooks.claude_hooks.hook_handler "$@" 2>/tmp/claude-mpm-hook-error.log; then
|
|
179
|
-
# If the Python handler fails, always return continue to not block Claude
|
|
187
|
+
# Function for debug logging
|
|
188
|
+
log_debug() {
|
|
180
189
|
if [ "${CLAUDE_MPM_HOOK_DEBUG}" = "true" ]; then
|
|
181
|
-
echo "[$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)]
|
|
182
|
-
|
|
190
|
+
echo "[$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)] $1" >> /tmp/claude-mpm-hook.log
|
|
191
|
+
fi
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
# Test Python works and module exists
|
|
195
|
+
# Handle UV's multi-word command specially
|
|
196
|
+
if [[ "$PYTHON_CMD" == "uv run python" ]]; then
|
|
197
|
+
if ! uv run python -c "import claude_mpm" 2>/dev/null; then
|
|
198
|
+
log_debug "claude_mpm module not available, continuing without hook"
|
|
199
|
+
echo '{"action": "continue"}'
|
|
200
|
+
exit 0
|
|
183
201
|
fi
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
202
|
+
else
|
|
203
|
+
if ! $PYTHON_CMD -c "import claude_mpm" 2>/dev/null; then
|
|
204
|
+
log_debug "claude_mpm module not available, continuing without hook"
|
|
205
|
+
echo '{"action": "continue"}'
|
|
206
|
+
exit 0
|
|
207
|
+
fi
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
# Run the Python hook handler with all input
|
|
211
|
+
# Use exec to replace the shell process with Python
|
|
212
|
+
# Handle UV's multi-word command specially
|
|
213
|
+
if [[ "$PYTHON_CMD" == "uv run python" ]]; then
|
|
214
|
+
exec uv run python -m claude_mpm.hooks.claude_hooks.hook_handler "$@" 2>/tmp/claude-mpm-hook-error.log
|
|
215
|
+
else
|
|
216
|
+
exec "$PYTHON_CMD" -m claude_mpm.hooks.claude_hooks.hook_handler "$@" 2>/tmp/claude-mpm-hook-error.log
|
|
217
|
+
fi
|
|
218
|
+
|
|
219
|
+
# Note: exec replaces the shell process, so code below only runs if exec fails
|
|
220
|
+
# If we reach here, the Python handler failed
|
|
221
|
+
if [ "${CLAUDE_MPM_HOOK_DEBUG}" = "true" ]; then
|
|
222
|
+
echo "[$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)] Hook handler failed, see /tmp/claude-mpm-hook-error.log" >> /tmp/claude-mpm-hook.log
|
|
223
|
+
echo "[$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)] Error: $(cat /tmp/claude-mpm-hook-error.log 2>/dev/null | head -5)" >> /tmp/claude-mpm-hook.log
|
|
224
|
+
fi
|
|
225
|
+
# Return continue action to prevent blocking Claude Code
|
|
226
|
+
echo '{"action": "continue"}'
|
|
227
|
+
exit 0
|
|
@@ -7,6 +7,12 @@ dashboard, which includes both the Socket.IO server and web interface.
|
|
|
7
7
|
|
|
8
8
|
WHY: Provides a simple command to start the monitoring dashboard that tracks
|
|
9
9
|
Claude MPM events and agent activity in real-time.
|
|
10
|
+
|
|
11
|
+
SINGLE INSTANCE ENFORCEMENT:
|
|
12
|
+
- Only ONE monitor instance runs at a time on port 8765 (default)
|
|
13
|
+
- If monitor already running on default port: reuse existing, open browser
|
|
14
|
+
- If user specifies --port explicitly: use that port, fail if busy
|
|
15
|
+
- No auto-increment port selection (prevents multiple instances)
|
|
10
16
|
"""
|
|
11
17
|
|
|
12
18
|
import argparse
|
|
@@ -15,12 +21,36 @@ import webbrowser
|
|
|
15
21
|
|
|
16
22
|
from claude_mpm.core.logging_config import get_logger
|
|
17
23
|
from claude_mpm.services.monitor.daemon import UnifiedMonitorDaemon
|
|
18
|
-
from claude_mpm.services.
|
|
24
|
+
from claude_mpm.services.monitor.daemon_manager import DaemonManager
|
|
19
25
|
|
|
20
26
|
DEFAULT_PORT = 8765
|
|
21
27
|
logger = get_logger(__name__)
|
|
22
28
|
|
|
23
29
|
|
|
30
|
+
def check_existing_monitor(host: str, port: int) -> bool:
|
|
31
|
+
"""Check if monitor is already running on the specified port.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
host: Host to check
|
|
35
|
+
port: Port to check
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
True if monitor is running, False otherwise
|
|
39
|
+
"""
|
|
40
|
+
try:
|
|
41
|
+
import requests
|
|
42
|
+
|
|
43
|
+
response = requests.get(f"http://{host}:{port}/health", timeout=2)
|
|
44
|
+
if response.status_code == 200:
|
|
45
|
+
data = response.json()
|
|
46
|
+
# Check if it's our claude-mpm-monitor service
|
|
47
|
+
if data.get("service") == "claude-mpm-monitor":
|
|
48
|
+
return True
|
|
49
|
+
except Exception:
|
|
50
|
+
pass
|
|
51
|
+
return False
|
|
52
|
+
|
|
53
|
+
|
|
24
54
|
def main():
|
|
25
55
|
"""Main entry point for monitor launcher."""
|
|
26
56
|
parser = argparse.ArgumentParser(
|
|
@@ -30,8 +60,8 @@ def main():
|
|
|
30
60
|
parser.add_argument(
|
|
31
61
|
"--port",
|
|
32
62
|
type=int,
|
|
33
|
-
default=DEFAULT_PORT
|
|
34
|
-
help=f"Port to run on (default: {DEFAULT_PORT})",
|
|
63
|
+
default=None, # Changed: None means use DEFAULT_PORT with single-instance check
|
|
64
|
+
help=f"Port to run on (default: {DEFAULT_PORT}). If specified, fails if port is busy.",
|
|
35
65
|
)
|
|
36
66
|
|
|
37
67
|
parser.add_argument(
|
|
@@ -46,20 +76,70 @@ def main():
|
|
|
46
76
|
"--background", action="store_true", help="Run in background daemon mode"
|
|
47
77
|
)
|
|
48
78
|
|
|
79
|
+
parser.add_argument(
|
|
80
|
+
"--dev",
|
|
81
|
+
action="store_true",
|
|
82
|
+
help="Enable development mode with hot reload for Svelte changes",
|
|
83
|
+
)
|
|
84
|
+
|
|
49
85
|
args = parser.parse_args()
|
|
50
86
|
|
|
51
|
-
#
|
|
52
|
-
|
|
53
|
-
|
|
87
|
+
# Determine target port
|
|
88
|
+
user_specified_port = args.port is not None
|
|
89
|
+
target_port = args.port if user_specified_port else DEFAULT_PORT
|
|
90
|
+
|
|
91
|
+
# SINGLE INSTANCE ENFORCEMENT:
|
|
92
|
+
# Check if monitor already running on target port
|
|
93
|
+
if check_existing_monitor(args.host, target_port):
|
|
94
|
+
logger.info(f"Monitor already running at http://{args.host}:{target_port}")
|
|
54
95
|
|
|
55
|
-
|
|
56
|
-
|
|
96
|
+
# Open browser to existing instance if requested
|
|
97
|
+
if not args.no_browser:
|
|
98
|
+
url = f"http://{args.host}:{target_port}"
|
|
99
|
+
logger.info(f"Opening browser to existing instance: {url}")
|
|
100
|
+
webbrowser.open(url)
|
|
101
|
+
|
|
102
|
+
# Success - reusing existing instance
|
|
103
|
+
return
|
|
104
|
+
|
|
105
|
+
# Port selection logic:
|
|
106
|
+
# - If user specified --port: Use that exact port, fail if busy
|
|
107
|
+
# - If no --port: Use DEFAULT_PORT (8765), fail if busy
|
|
108
|
+
# - Never auto-increment to find free port
|
|
109
|
+
|
|
110
|
+
# Create daemon manager for port checking
|
|
111
|
+
daemon_manager = DaemonManager(port=target_port, host=args.host)
|
|
112
|
+
|
|
113
|
+
if not daemon_manager._is_port_available():
|
|
114
|
+
if user_specified_port:
|
|
115
|
+
# User explicitly requested a port - fail with clear message
|
|
116
|
+
logger.error(
|
|
117
|
+
f"Port {target_port} is already in use by another service. "
|
|
118
|
+
f"Please stop the existing service or choose a different port."
|
|
119
|
+
)
|
|
120
|
+
sys.exit(1)
|
|
121
|
+
else:
|
|
122
|
+
# Default port is busy - fail with helpful message
|
|
123
|
+
logger.error(
|
|
124
|
+
f"Default port {DEFAULT_PORT} is already in use by another service. "
|
|
125
|
+
f"Please stop the existing service with 'claude-mpm monitor stop' "
|
|
126
|
+
f"or specify a different port with --port."
|
|
127
|
+
)
|
|
128
|
+
sys.exit(1)
|
|
57
129
|
|
|
58
130
|
# Start the monitor daemon
|
|
59
|
-
|
|
131
|
+
if args.dev:
|
|
132
|
+
logger.info(
|
|
133
|
+
f"Starting Claude MPM monitor on {args.host}:{target_port} (DEV MODE - hot reload enabled)"
|
|
134
|
+
)
|
|
135
|
+
else:
|
|
136
|
+
logger.info(f"Starting Claude MPM monitor on {args.host}:{target_port}")
|
|
60
137
|
|
|
61
138
|
daemon = UnifiedMonitorDaemon(
|
|
62
|
-
host=args.host,
|
|
139
|
+
host=args.host,
|
|
140
|
+
port=target_port,
|
|
141
|
+
daemon_mode=args.background,
|
|
142
|
+
enable_hot_reload=args.dev,
|
|
63
143
|
)
|
|
64
144
|
|
|
65
145
|
success = daemon.start()
|
|
@@ -67,14 +147,14 @@ def main():
|
|
|
67
147
|
if success:
|
|
68
148
|
# Open browser if requested
|
|
69
149
|
if not args.no_browser:
|
|
70
|
-
url = f"http://{args.host}:{
|
|
150
|
+
url = f"http://{args.host}:{target_port}"
|
|
71
151
|
logger.info(f"Opening browser to {url}")
|
|
72
152
|
webbrowser.open(url)
|
|
73
153
|
|
|
74
154
|
if args.background:
|
|
75
|
-
logger.info(f"Monitor daemon started in background on port {
|
|
155
|
+
logger.info(f"Monitor daemon started in background on port {target_port}")
|
|
76
156
|
else:
|
|
77
|
-
logger.info(f"Monitor running on port {
|
|
157
|
+
logger.info(f"Monitor running on port {target_port}")
|
|
78
158
|
logger.info("Press Ctrl+C to stop")
|
|
79
159
|
else:
|
|
80
160
|
logger.error("Failed to start monitor")
|
|
@@ -51,7 +51,9 @@ if __name__ == "__main__":
|
|
|
51
51
|
|
|
52
52
|
# Initialize aggregator
|
|
53
53
|
aggregator = EventAggregator(
|
|
54
|
-
host="localhost",
|
|
54
|
+
host="localhost",
|
|
55
|
+
port=dashboard_port,
|
|
56
|
+
save_dir=None, # Will use config value
|
|
55
57
|
)
|
|
56
58
|
|
|
57
59
|
# Set up signal handlers
|
|
@@ -8,12 +8,13 @@ This service provides comprehensive agent lifecycle management including:
|
|
|
8
8
|
- Integration with deployment services
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
import json
|
|
12
11
|
import re
|
|
13
12
|
from datetime import datetime, timezone
|
|
14
13
|
from pathlib import Path
|
|
15
14
|
from typing import Any, ClassVar, Dict, List, Optional, Tuple
|
|
16
15
|
|
|
16
|
+
import yaml
|
|
17
|
+
|
|
17
18
|
from claude_mpm.core.exceptions import AgentDeploymentError
|
|
18
19
|
from claude_mpm.core.logging_config import get_logger
|
|
19
20
|
|
|
@@ -205,8 +206,8 @@ class AgentBuilderService:
|
|
|
205
206
|
"""
|
|
206
207
|
errors = []
|
|
207
208
|
|
|
208
|
-
# Required fields
|
|
209
|
-
required_fields = ["id", "name", "prompt"
|
|
209
|
+
# Required fields (model is optional - defaults to sonnet if not specified)
|
|
210
|
+
required_fields = ["id", "name", "prompt"]
|
|
210
211
|
for field in required_fields:
|
|
211
212
|
if field not in config:
|
|
212
213
|
errors.append(f"Missing required field: {field}")
|
|
@@ -218,7 +219,7 @@ class AgentBuilderService:
|
|
|
218
219
|
except AgentDeploymentError as e:
|
|
219
220
|
errors.append(str(e))
|
|
220
221
|
|
|
221
|
-
# Validate model
|
|
222
|
+
# Validate model (only if present)
|
|
222
223
|
if "model" in config:
|
|
223
224
|
try:
|
|
224
225
|
self._validate_model(config["model"])
|
|
@@ -285,10 +286,15 @@ class AgentBuilderService:
|
|
|
285
286
|
if not self.templates_dir.exists():
|
|
286
287
|
return templates
|
|
287
288
|
|
|
288
|
-
|
|
289
|
+
# Agent templates migrated to Markdown with YAML frontmatter (v4.26.0+)
|
|
290
|
+
for template_file in self.templates_dir.glob("*.md"):
|
|
289
291
|
try:
|
|
290
|
-
|
|
291
|
-
|
|
292
|
+
# Read markdown content and extract YAML frontmatter
|
|
293
|
+
content = template_file.read_text()
|
|
294
|
+
config = self._extract_yaml_frontmatter(content)
|
|
295
|
+
if not config:
|
|
296
|
+
self.logger.warning(f"No YAML frontmatter in {template_file.name}")
|
|
297
|
+
continue
|
|
292
298
|
|
|
293
299
|
# Use filename stem as ID if not specified in config
|
|
294
300
|
template_id = config.get("id") or template_file.stem
|
|
@@ -308,6 +314,30 @@ class AgentBuilderService:
|
|
|
308
314
|
|
|
309
315
|
return templates
|
|
310
316
|
|
|
317
|
+
def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
|
|
318
|
+
"""
|
|
319
|
+
Extract and parse YAML frontmatter from markdown content.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
content: File content to parse
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
Parsed YAML frontmatter as dict, or None if not found/invalid
|
|
326
|
+
"""
|
|
327
|
+
if not content.strip().startswith("---"):
|
|
328
|
+
return None
|
|
329
|
+
|
|
330
|
+
# Split on --- delimiters
|
|
331
|
+
parts = content.split("---", 2)
|
|
332
|
+
if len(parts) < 3:
|
|
333
|
+
return None
|
|
334
|
+
|
|
335
|
+
try:
|
|
336
|
+
return yaml.safe_load(parts[1])
|
|
337
|
+
except yaml.YAMLError as e:
|
|
338
|
+
self.logger.warning(f"Failed to parse YAML frontmatter: {e}")
|
|
339
|
+
return None
|
|
340
|
+
|
|
311
341
|
def _validate_agent_id(self, agent_id: str) -> None:
|
|
312
342
|
"""Validate agent ID format.
|
|
313
343
|
|
|
@@ -371,16 +401,22 @@ class AgentBuilderService:
|
|
|
371
401
|
if template_id in self._template_cache:
|
|
372
402
|
return self._template_cache[template_id].copy()
|
|
373
403
|
|
|
374
|
-
|
|
404
|
+
# Agent templates migrated to Markdown with YAML frontmatter (v4.26.0+)
|
|
405
|
+
template_file = self.templates_dir / f"{template_id}.md"
|
|
375
406
|
|
|
376
407
|
if not template_file.exists():
|
|
377
408
|
raise AgentDeploymentError(f"Template '{template_id}' not found")
|
|
378
409
|
|
|
379
410
|
try:
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
411
|
+
# Read markdown content and extract YAML frontmatter
|
|
412
|
+
content = template_file.read_text()
|
|
413
|
+
config = self._extract_yaml_frontmatter(content)
|
|
414
|
+
if not config:
|
|
415
|
+
raise AgentDeploymentError(
|
|
416
|
+
f"No YAML frontmatter in template '{template_id}'"
|
|
417
|
+
)
|
|
418
|
+
self._template_cache[template_id] = config
|
|
419
|
+
return config.copy()
|
|
384
420
|
except Exception as e:
|
|
385
421
|
raise AgentDeploymentError(
|
|
386
422
|
f"Failed to load template '{template_id}': {e}"
|