claude-mpm 4.25.10__py3-none-any.whl → 5.1.8__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/agents/BASE_PM.md +12 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1055 -2230
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +4 -4
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent_loader.py +10 -35
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +576 -66
- claude_mpm/agents/templates/context-management-examples.md +544 -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 +28 -3
- 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 +188 -30
- claude_mpm/cli/commands/agents.py +959 -36
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/auto_configure.py +537 -239
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +924 -45
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +1 -39
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +322 -19
- claude_mpm/cli/executor.py +22 -3
- claude_mpm/cli/interactive/agent_wizard.py +1028 -43
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +256 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +25 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +7 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +456 -103
- claude_mpm/cli/startup_display.py +4 -4
- claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +14 -2
- claude_mpm/commands/mpm-init.md +9 -0
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +16 -0
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/interactive_session.py +83 -7
- claude_mpm/core/oneshot_session.py +71 -8
- 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/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- 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/models/git_repository.py +198 -0
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -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 +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -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/multi_source_deployment_service.py +115 -15
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -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 +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +1 -4
- claude_mpm/services/agents/local_template_manager.py +47 -9
- 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 +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/command_deployment_service.py +200 -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_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- 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 +34 -6
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -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/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/monitor/daemon.py +28 -8
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/templates/questions/__init__.py +2 -7
- claude_mpm/templates/questions/pr_strategy.py +1 -4
- claude_mpm/templates/questions/project_init.py +1 -4
- claude_mpm/templates/questions/ticket_mgmt.py +1 -4
- claude_mpm/utils/agent_dependency_loader.py +77 -10
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/gitignore.py +3 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +356 -112
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +188 -439
- 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/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/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 -258
- 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 -181
- 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/README.md +0 -253
- claude_mpm/cli/commands/mcp_install_commands.py.backup +0 -284
- claude_mpm/cli/commands/mpm_init/README.md +0 -365
- claude_mpm/cli_module/refactoring_guide.md +0 -253
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/config/agent_capabilities.yaml +0 -658
- claude_mpm/config/async_logging_config.yaml +0 -145
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +0 -34
- claude_mpm/d2/.gitignore +0 -22
- claude_mpm/d2/ARCHITECTURE_COMPARISON.md +0 -273
- claude_mpm/d2/FLASK_INTEGRATION.md +0 -156
- claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +0 -452
- claude_mpm/d2/QUICKSTART.md +0 -186
- claude_mpm/d2/README.md +0 -232
- claude_mpm/d2/STORE_FIX_SUMMARY.md +0 -167
- claude_mpm/d2/SVELTE5_STORES_GUIDE.md +0 -180
- claude_mpm/d2/TESTING.md +0 -288
- claude_mpm/d2/index.html +0 -118
- claude_mpm/d2/package.json +0 -19
- claude_mpm/d2/src/App.svelte +0 -110
- claude_mpm/d2/src/components/Header.svelte +0 -153
- claude_mpm/d2/src/components/MainContent.svelte +0 -74
- claude_mpm/d2/src/components/Sidebar.svelte +0 -85
- claude_mpm/d2/src/components/tabs/EventsTab.svelte +0 -326
- claude_mpm/d2/src/lib/socketio.js +0 -144
- claude_mpm/d2/src/main.js +0 -7
- claude_mpm/d2/src/stores/events.js +0 -114
- claude_mpm/d2/src/stores/socket.js +0 -108
- claude_mpm/d2/src/stores/theme.js +0 -65
- claude_mpm/d2/svelte.config.js +0 -12
- claude_mpm/d2/vite.config.js +0 -15
- claude_mpm/dashboard/.claude-mpm/memories/README.md +0 -36
- claude_mpm/dashboard/BUILD_NUMBER +0 -1
- claude_mpm/dashboard/README.md +0 -121
- claude_mpm/dashboard/VERSION +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +0 -273
- claude_mpm/dashboard/react/components/ErrorBoundary.tsx +0 -75
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +0 -141
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +0 -36
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/react/components/shared/FilterBar.tsx +0 -89
- claude_mpm/dashboard/react/contexts/DashboardContext.tsx +0 -215
- claude_mpm/dashboard/react/entries/events.tsx +0 -165
- claude_mpm/dashboard/react/hooks/useEvents.ts +0 -191
- claude_mpm/dashboard/react/hooks/useSocket.ts +0 -225
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +0 -170
- 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/activity-tree.js.map +0 -1
- 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/agent-inference.js.map +0 -1
- 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-tree.js.map +0 -1
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js.map +0 -1
- 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-processor.js.map +0 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js.map +0 -1
- 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-tool-tracker.js.map +0 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +0 -1
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js.map +0 -1
- 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/session-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js.map +0 -1
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/dashboard.js.map +0 -1
- 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/react/events.js.map +0 -1
- 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/socket-client.js.map +0 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +0 -170
- 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/stores/dashboard-store.js +0 -562
- 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/navigation-test-results.md +0 -118
- 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/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/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +0 -39
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +0 -38
- claude_mpm/hooks/README.md +0 -143
- claude_mpm/hooks/templates/README.md +0 -180
- claude_mpm/hooks/templates/settings.json.example +0 -147
- claude_mpm/schemas/agent_schema.json +0 -596
- claude_mpm/schemas/frontmatter_schema.json +0 -165
- claude_mpm/services/event_bus/README.md +0 -244
- claude_mpm/services/events/README.md +0 -303
- claude_mpm/services/framework_claude_md_generator/README.md +0 -119
- claude_mpm/services/mcp_gateway/README.md +0 -185
- claude_mpm/services/socketio/handlers/connection.py.backup +0 -217
- claude_mpm/services/socketio/handlers/hook.py.backup +0 -154
- claude_mpm/services/static/.gitkeep +0 -2
- claude_mpm/services/version_control/VERSION +0 -1
- claude_mpm/skills/bundled/.gitkeep +0 -2
- 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/git-worktrees.md +0 -317
- 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/stacked-prs.md +0 -251
- 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/find-polluter.sh +0 -63
- 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/infrastructure/env-manager/INTEGRATION.md +0 -611
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +0 -596
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +0 -260
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +0 -315
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +0 -436
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +0 -433
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +0 -452
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +0 -404
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +0 -420
- claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +0 -202
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +0 -54
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +0 -322
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +0 -202
- 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/LICENSE.txt +0 -202
- 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/mcp-builder/scripts/example_evaluation.xml +0 -22
- claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +0 -2
- claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +0 -202
- 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/react/flexlayout-react.md +0 -742
- 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/tauri/tauri-async-patterns.md +0 -495
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +0 -599
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +0 -535
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +0 -613
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +0 -648
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +0 -673
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +0 -767
- claude_mpm/skills/bundled/tauri/tauri-performance.md +0 -669
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +0 -573
- claude_mpm/skills/bundled/tauri/tauri-testing.md +0 -384
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +0 -628
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +0 -158
- 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/test-quality-inspector/SKILL.md +0 -458
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +0 -411
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +0 -317
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +0 -270
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +0 -436
- 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/LICENSE.txt +0 -202
- 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/templates/questions/EXAMPLES.md +0 -501
- claude_mpm/tools/README_SOCKETIO_DEBUG.md +0 -224
- claude_mpm/tools/code_tree_analyzer/README.md +0 -64
- /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/{pm_red_flags.md → pm-red-flags.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.25.10.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
|
@@ -31,6 +31,7 @@ import time
|
|
|
31
31
|
from pathlib import Path
|
|
32
32
|
from typing import Any, Dict, List, Optional, Tuple
|
|
33
33
|
|
|
34
|
+
from claude_mpm.config.agent_sources import AgentSourceConfiguration
|
|
34
35
|
from claude_mpm.config.paths import paths
|
|
35
36
|
from claude_mpm.constants import Paths
|
|
36
37
|
from claude_mpm.core.config import Config
|
|
@@ -38,6 +39,8 @@ from claude_mpm.core.exceptions import AgentDeploymentError
|
|
|
38
39
|
from claude_mpm.core.interfaces import AgentDeploymentInterface
|
|
39
40
|
from claude_mpm.services.shared import ConfigServiceBase
|
|
40
41
|
|
|
42
|
+
# Import git source management for remote agent sync
|
|
43
|
+
from ..git_source_manager import GitSourceManager
|
|
41
44
|
from .agent_configuration_manager import AgentConfigurationManager
|
|
42
45
|
from .agent_discovery_service import AgentDiscoveryService
|
|
43
46
|
from .agent_environment_manager import AgentEnvironmentManager
|
|
@@ -184,9 +187,110 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
184
187
|
# Initialize format converter service
|
|
185
188
|
self.format_converter = AgentFormatConverter()
|
|
186
189
|
|
|
190
|
+
# Initialize git source manager for remote agent sync
|
|
191
|
+
self.git_source_manager = GitSourceManager()
|
|
192
|
+
self.agent_source_config = AgentSourceConfiguration.load()
|
|
193
|
+
|
|
187
194
|
self.logger.info(f"Templates directory: {self.templates_dir}")
|
|
188
195
|
self.logger.info(f"Base agent path: {self.base_agent_path}")
|
|
189
196
|
|
|
197
|
+
def _sync_remote_agent_sources(self, timeout_seconds: int = 30) -> Dict[str, Any]:
|
|
198
|
+
"""Sync git-based agent sources before deployment.
|
|
199
|
+
|
|
200
|
+
This method follows the skills system pattern: sync configured git repositories
|
|
201
|
+
to cache before discovery. Network failures are logged but don't block deployment.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
timeout_seconds: Timeout for git operations (default: 30 seconds)
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
Dictionary with sync results:
|
|
208
|
+
{
|
|
209
|
+
"synced_count": int,
|
|
210
|
+
"failed_count": int,
|
|
211
|
+
"repositories": Dict[str, Dict], # repo_id -> sync result
|
|
212
|
+
"duration_ms": float
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
Error Handling:
|
|
216
|
+
- Network failures: Logged as warnings, sync continues
|
|
217
|
+
- Invalid repos: Logged as errors, sync continues
|
|
218
|
+
- Timeout: Individual repo timeouts don't stop overall sync
|
|
219
|
+
- Missing cache dir: Created automatically
|
|
220
|
+
"""
|
|
221
|
+
import time
|
|
222
|
+
|
|
223
|
+
start_time = time.time()
|
|
224
|
+
|
|
225
|
+
results = {
|
|
226
|
+
"synced_count": 0,
|
|
227
|
+
"failed_count": 0,
|
|
228
|
+
"repositories": {},
|
|
229
|
+
"duration_ms": 0,
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
# Load agent sources configuration
|
|
233
|
+
try:
|
|
234
|
+
config = AgentSourceConfiguration.load()
|
|
235
|
+
enabled_repos = [r for r in config.repositories if r.enabled]
|
|
236
|
+
|
|
237
|
+
if not enabled_repos:
|
|
238
|
+
self.logger.debug("No enabled agent sources configured")
|
|
239
|
+
return results
|
|
240
|
+
|
|
241
|
+
self.logger.info(f"Syncing {len(enabled_repos)} agent git sources...")
|
|
242
|
+
|
|
243
|
+
# Sync each enabled repository
|
|
244
|
+
for repo in enabled_repos:
|
|
245
|
+
repo_id = repo.identifier
|
|
246
|
+
try:
|
|
247
|
+
# Sync with timeout (individual repo sync)
|
|
248
|
+
# NOTE: show_progress=False to avoid duplicate progress bars
|
|
249
|
+
# (startup sync already showed progress to user)
|
|
250
|
+
sync_result = self.git_source_manager.sync_repository(
|
|
251
|
+
repo,
|
|
252
|
+
force=False, # Use ETag-based caching
|
|
253
|
+
show_progress=False, # Suppress progress (startup already synced)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
results["repositories"][repo_id] = sync_result
|
|
257
|
+
|
|
258
|
+
if sync_result.get("synced"):
|
|
259
|
+
results["synced_count"] += 1
|
|
260
|
+
agents_discovered = sync_result.get("agents_discovered", [])
|
|
261
|
+
self.logger.info(
|
|
262
|
+
f"Synced {repo_id}: {sync_result.get('files_updated', 0)} files, "
|
|
263
|
+
f"{len(agents_discovered)} agents"
|
|
264
|
+
)
|
|
265
|
+
else:
|
|
266
|
+
results["failed_count"] += 1
|
|
267
|
+
error = sync_result.get("error", "Unknown error")
|
|
268
|
+
self.logger.warning(f"Failed to sync {repo_id}: {error}")
|
|
269
|
+
|
|
270
|
+
except Exception as e:
|
|
271
|
+
# Don't let individual repo failures stop deployment
|
|
272
|
+
results["failed_count"] += 1
|
|
273
|
+
results["repositories"][repo_id] = {
|
|
274
|
+
"synced": False,
|
|
275
|
+
"error": str(e),
|
|
276
|
+
}
|
|
277
|
+
self.logger.warning(f"Exception syncing {repo_id}: {e}")
|
|
278
|
+
|
|
279
|
+
except Exception as e:
|
|
280
|
+
# Configuration loading failure - log but don't crash
|
|
281
|
+
self.logger.warning(f"Failed to load agent sources config: {e}")
|
|
282
|
+
results["failed_count"] = -1 # Indicates config failure
|
|
283
|
+
|
|
284
|
+
results["duration_ms"] = (time.time() - start_time) * 1000
|
|
285
|
+
|
|
286
|
+
if results["synced_count"] > 0:
|
|
287
|
+
self.logger.info(
|
|
288
|
+
f"Agent source sync complete: {results['synced_count']} succeeded, "
|
|
289
|
+
f"{results['failed_count']} failed ({results['duration_ms']:.0f}ms)"
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
return results
|
|
293
|
+
|
|
190
294
|
def deploy_agents(
|
|
191
295
|
self,
|
|
192
296
|
target_dir: Optional[Path] = None,
|
|
@@ -267,6 +371,10 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
267
371
|
# METRICS: Record deployment start time for performance tracking
|
|
268
372
|
deployment_start_time = time.time()
|
|
269
373
|
|
|
374
|
+
# PHASE 2 (1M-442): Sync git-based agent sources before deployment
|
|
375
|
+
# This ensures remote agents from configured sources are cached and discoverable
|
|
376
|
+
sync_results = self._sync_remote_agent_sources()
|
|
377
|
+
|
|
270
378
|
# Try async deployment for better performance if requested
|
|
271
379
|
if use_async:
|
|
272
380
|
async_results = self._try_async_deployment(
|
|
@@ -292,6 +400,13 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
292
400
|
agents_dir, deployment_start_time
|
|
293
401
|
)
|
|
294
402
|
|
|
403
|
+
# Add git source sync results to deployment results
|
|
404
|
+
if (
|
|
405
|
+
sync_results.get("synced_count", 0) > 0
|
|
406
|
+
or sync_results.get("failed_count", 0) > 0
|
|
407
|
+
):
|
|
408
|
+
results["remote_sources"] = sync_results
|
|
409
|
+
|
|
295
410
|
try:
|
|
296
411
|
# Create agents directory if needed
|
|
297
412
|
agents_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -754,19 +869,28 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
754
869
|
project_agents_dir = potential_project_dir
|
|
755
870
|
self.logger.info(f"Found project agents at: {project_agents_dir}")
|
|
756
871
|
|
|
757
|
-
# Check for user agents
|
|
872
|
+
# Check for user agents (DEPRECATED)
|
|
758
873
|
user_home = Path.home()
|
|
759
874
|
potential_user_dir = user_home / ".claude-mpm" / "agents"
|
|
760
875
|
if potential_user_dir.exists():
|
|
761
876
|
user_agents_dir = potential_user_dir
|
|
762
877
|
self.logger.info(f"Found user agents at: {user_agents_dir}")
|
|
763
878
|
|
|
764
|
-
#
|
|
879
|
+
# Check for remote agents (cached from GitHub)
|
|
880
|
+
remote_agents_dir = None
|
|
881
|
+
cache_dir = user_home / ".claude-mpm" / "cache"
|
|
882
|
+
potential_remote_dir = cache_dir / "remote-agents"
|
|
883
|
+
if potential_remote_dir.exists():
|
|
884
|
+
remote_agents_dir = potential_remote_dir
|
|
885
|
+
self.logger.info(f"Found remote agents cache at: {remote_agents_dir}")
|
|
886
|
+
|
|
887
|
+
# Get agents with version comparison and cleanup (4-tier discovery)
|
|
765
888
|
agents_to_deploy, agent_sources, cleanup_results = (
|
|
766
889
|
self.multi_source_service.get_agents_for_deployment(
|
|
767
890
|
system_templates_dir=system_templates_dir,
|
|
768
891
|
project_agents_dir=project_agents_dir,
|
|
769
892
|
user_agents_dir=user_agents_dir,
|
|
893
|
+
remote_agents_dir=remote_agents_dir, # NEW: 4th tier
|
|
770
894
|
working_directory=self.working_directory,
|
|
771
895
|
excluded_agents=excluded_agents,
|
|
772
896
|
config=config,
|
|
@@ -7,10 +7,11 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
|
|
|
7
7
|
maintainability and testability.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import json
|
|
11
10
|
from pathlib import Path
|
|
12
11
|
from typing import Any, Dict, List, Optional
|
|
13
12
|
|
|
13
|
+
import yaml
|
|
14
|
+
|
|
14
15
|
from claude_mpm.core.config import Config
|
|
15
16
|
from claude_mpm.core.logging_config import get_logger
|
|
16
17
|
|
|
@@ -59,8 +60,8 @@ class AgentDiscoveryService:
|
|
|
59
60
|
)
|
|
60
61
|
return agents
|
|
61
62
|
|
|
62
|
-
# Find all
|
|
63
|
-
template_files = list(self.templates_dir.glob("*.
|
|
63
|
+
# Find all markdown template files with YAML frontmatter
|
|
64
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
64
65
|
|
|
65
66
|
for template_file in template_files:
|
|
66
67
|
try:
|
|
@@ -105,8 +106,8 @@ class AgentDiscoveryService:
|
|
|
105
106
|
self.logger.error(f"Templates directory not found: {self.templates_dir}")
|
|
106
107
|
return []
|
|
107
108
|
|
|
108
|
-
# Get all template files
|
|
109
|
-
template_files = list(self.templates_dir.glob("*.
|
|
109
|
+
# Get all markdown template files
|
|
110
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
110
111
|
|
|
111
112
|
if not template_files:
|
|
112
113
|
self.logger.warning(f"No agent templates found in {self.templates_dir}")
|
|
@@ -157,7 +158,7 @@ class AgentDiscoveryService:
|
|
|
157
158
|
Returns:
|
|
158
159
|
Path to template file if found, None otherwise
|
|
159
160
|
"""
|
|
160
|
-
template_file = self.templates_dir / f"{agent_name}.
|
|
161
|
+
template_file = self.templates_dir / f"{agent_name}.md"
|
|
161
162
|
|
|
162
163
|
if template_file.exists():
|
|
163
164
|
if self._validate_template_file(template_file):
|
|
@@ -199,59 +200,45 @@ class AgentDiscoveryService:
|
|
|
199
200
|
|
|
200
201
|
def _extract_agent_metadata(self, template_file: Path) -> Optional[Dict[str, Any]]:
|
|
201
202
|
"""
|
|
202
|
-
Extract metadata from an agent template file.
|
|
203
|
+
Extract metadata from an agent template file with YAML frontmatter.
|
|
203
204
|
|
|
204
205
|
Args:
|
|
205
|
-
template_file: Path to the template file
|
|
206
|
+
template_file: Path to the markdown template file
|
|
206
207
|
|
|
207
208
|
Returns:
|
|
208
209
|
Dictionary with agent metadata or None if extraction fails
|
|
209
210
|
"""
|
|
210
211
|
try:
|
|
211
|
-
# Read
|
|
212
|
+
# Read template file content
|
|
212
213
|
template_content = template_file.read_text()
|
|
213
|
-
template_data = json.loads(template_content)
|
|
214
|
-
|
|
215
|
-
# Extract basic metadata from the metadata section (per agent schema)
|
|
216
|
-
metadata = template_data.get("metadata", {})
|
|
217
|
-
capabilities = template_data.get("capabilities", {})
|
|
218
|
-
|
|
219
|
-
# Handle capabilities as either dict or list
|
|
220
|
-
if isinstance(capabilities, list):
|
|
221
|
-
# If capabilities is a list (like in php-engineer.json), treat it as capabilities list
|
|
222
|
-
tools_list = template_data.get(
|
|
223
|
-
"tools", []
|
|
224
|
-
) # Look for tools at root level
|
|
225
|
-
model_value = template_data.get("model", "sonnet")
|
|
226
|
-
else:
|
|
227
|
-
# If capabilities is a dict, extract tools and model from it
|
|
228
|
-
tools_list = capabilities.get("tools", [])
|
|
229
|
-
model_value = capabilities.get("model", "sonnet")
|
|
230
214
|
|
|
215
|
+
# Extract YAML frontmatter
|
|
216
|
+
frontmatter = self._extract_yaml_frontmatter(template_content)
|
|
217
|
+
if not frontmatter:
|
|
218
|
+
self.logger.warning(
|
|
219
|
+
f"No valid YAML frontmatter in {template_file.name}"
|
|
220
|
+
)
|
|
221
|
+
return None
|
|
222
|
+
|
|
223
|
+
# Extract metadata directly from frontmatter (flat structure)
|
|
224
|
+
# Markdown templates use flat YAML structure, not nested "metadata" section
|
|
231
225
|
agent_info = {
|
|
232
|
-
"name":
|
|
233
|
-
"description":
|
|
234
|
-
"description",
|
|
235
|
-
template_data.get("description", "No description available"),
|
|
226
|
+
"name": frontmatter.get("name", template_file.stem),
|
|
227
|
+
"description": frontmatter.get(
|
|
228
|
+
"description", "No description available"
|
|
236
229
|
),
|
|
237
|
-
"type":
|
|
238
|
-
"agent_type",
|
|
239
|
-
metadata.get("category", template_data.get("category", "agent")),
|
|
240
|
-
), # Extract agent type
|
|
241
|
-
"version": template_data.get(
|
|
242
|
-
"agent_version",
|
|
243
|
-
template_data.get("version", metadata.get("version", "1.0.0")),
|
|
230
|
+
"type": frontmatter.get(
|
|
231
|
+
"agent_type", frontmatter.get("category", "agent")
|
|
244
232
|
),
|
|
245
|
-
"
|
|
246
|
-
"
|
|
247
|
-
|
|
248
|
-
), # Use tags as specializations, fallback to root-level tags
|
|
233
|
+
"version": frontmatter.get("version", "1.0.0"),
|
|
234
|
+
"tools": frontmatter.get("tools", []),
|
|
235
|
+
"specializations": frontmatter.get("tags", []),
|
|
249
236
|
"file": template_file.name,
|
|
250
237
|
"path": str(template_file),
|
|
251
238
|
"file_path": str(template_file), # Keep for backward compatibility
|
|
252
239
|
"size": template_file.stat().st_size,
|
|
253
|
-
"model":
|
|
254
|
-
"author":
|
|
240
|
+
"model": frontmatter.get("model", "sonnet"),
|
|
241
|
+
"author": frontmatter.get("author", "unknown"),
|
|
255
242
|
}
|
|
256
243
|
|
|
257
244
|
# Validate required fields
|
|
@@ -261,8 +248,8 @@ class AgentDiscoveryService:
|
|
|
261
248
|
|
|
262
249
|
return agent_info
|
|
263
250
|
|
|
264
|
-
except
|
|
265
|
-
self.logger.error(f"Invalid
|
|
251
|
+
except yaml.YAMLError as e:
|
|
252
|
+
self.logger.error(f"Invalid YAML frontmatter in {template_file.name}: {e}")
|
|
266
253
|
return None
|
|
267
254
|
except Exception as e:
|
|
268
255
|
self.logger.error(
|
|
@@ -270,37 +257,73 @@ class AgentDiscoveryService:
|
|
|
270
257
|
)
|
|
271
258
|
return None
|
|
272
259
|
|
|
260
|
+
def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
|
|
261
|
+
"""
|
|
262
|
+
Extract and parse YAML frontmatter from markdown.
|
|
263
|
+
|
|
264
|
+
Frontmatter must be at the start of the file, delimited by '---'.
|
|
265
|
+
Example:
|
|
266
|
+
---
|
|
267
|
+
name: agent_name
|
|
268
|
+
description: Agent description
|
|
269
|
+
version: 1.0.0
|
|
270
|
+
---
|
|
271
|
+
# Agent content...
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
content: File content to parse
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
Parsed YAML frontmatter as dict, or None if not found/invalid
|
|
278
|
+
"""
|
|
279
|
+
if not content.strip().startswith("---"):
|
|
280
|
+
return None
|
|
281
|
+
|
|
282
|
+
# Split on --- delimiters
|
|
283
|
+
parts = content.split("---", 2)
|
|
284
|
+
if len(parts) < 3:
|
|
285
|
+
return None
|
|
286
|
+
|
|
287
|
+
try:
|
|
288
|
+
return yaml.safe_load(parts[1])
|
|
289
|
+
except yaml.YAMLError as e:
|
|
290
|
+
self.logger.warning(f"Failed to parse YAML frontmatter: {e}")
|
|
291
|
+
return None
|
|
292
|
+
|
|
273
293
|
def _is_mpm_agent(self, template_file: Path) -> bool:
|
|
274
294
|
"""Check if agent is authored by Claude MPM team.
|
|
275
295
|
|
|
276
296
|
MPM agents must have:
|
|
277
297
|
- An author field containing 'claude mpm', 'claude-mpm', or 'anthropic'
|
|
278
|
-
- A valid
|
|
298
|
+
- A valid version field
|
|
279
299
|
|
|
280
300
|
Args:
|
|
281
|
-
template_file: Path to the agent template
|
|
301
|
+
template_file: Path to the agent template markdown file
|
|
282
302
|
|
|
283
303
|
Returns:
|
|
284
304
|
True if this is an MPM agent, False otherwise
|
|
285
305
|
"""
|
|
286
306
|
try:
|
|
287
|
-
|
|
288
|
-
|
|
307
|
+
# Extract YAML frontmatter
|
|
308
|
+
content = template_file.read_text()
|
|
309
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
310
|
+
if not frontmatter:
|
|
311
|
+
return False
|
|
289
312
|
|
|
290
313
|
# Check for author field
|
|
291
|
-
author =
|
|
314
|
+
author = frontmatter.get("author", "").lower()
|
|
292
315
|
has_valid_author = any(
|
|
293
316
|
pattern in author
|
|
294
317
|
for pattern in ["claude mpm", "claude-mpm", "anthropic"]
|
|
295
318
|
)
|
|
296
319
|
|
|
297
320
|
# Check for version field
|
|
298
|
-
has_version = bool(
|
|
321
|
+
has_version = bool(frontmatter.get("version"))
|
|
299
322
|
|
|
300
323
|
if not has_valid_author or not has_version:
|
|
301
324
|
self.logger.debug(
|
|
302
325
|
f"Filtered non-MPM agent {template_file.name}: "
|
|
303
|
-
f"author='{
|
|
326
|
+
f"author='{frontmatter.get('author', 'missing')}', "
|
|
304
327
|
f"version={'present' if has_version else 'missing'}"
|
|
305
328
|
)
|
|
306
329
|
|
|
@@ -366,10 +389,10 @@ class AgentDiscoveryService:
|
|
|
366
389
|
|
|
367
390
|
def _validate_template_file(self, template_file: Path) -> bool:
|
|
368
391
|
"""
|
|
369
|
-
Validate that a template file is properly formatted.
|
|
392
|
+
Validate that a template file is properly formatted with YAML frontmatter.
|
|
370
393
|
|
|
371
394
|
Args:
|
|
372
|
-
template_file: Path to template file to validate
|
|
395
|
+
template_file: Path to markdown template file to validate
|
|
373
396
|
|
|
374
397
|
Returns:
|
|
375
398
|
True if template is valid, False otherwise
|
|
@@ -379,23 +402,27 @@ class AgentDiscoveryService:
|
|
|
379
402
|
if not template_file.exists():
|
|
380
403
|
return False
|
|
381
404
|
|
|
382
|
-
#
|
|
405
|
+
# Read and parse YAML frontmatter
|
|
383
406
|
content = template_file.read_text()
|
|
384
|
-
|
|
407
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
408
|
+
if not frontmatter:
|
|
409
|
+
self.logger.warning(
|
|
410
|
+
f"Template {template_file.name} has no valid YAML frontmatter"
|
|
411
|
+
)
|
|
412
|
+
return False
|
|
385
413
|
|
|
386
|
-
# Check required fields
|
|
387
|
-
metadata = template_data.get("metadata", {})
|
|
414
|
+
# Check required fields (flat structure in markdown templates)
|
|
388
415
|
required_fields = ["name", "description"]
|
|
389
416
|
for field in required_fields:
|
|
390
|
-
if field not in
|
|
417
|
+
if field not in frontmatter:
|
|
391
418
|
self.logger.warning(
|
|
392
|
-
f"Template {template_file.name} missing required field
|
|
419
|
+
f"Template {template_file.name} missing required field: {field}"
|
|
393
420
|
)
|
|
394
421
|
return False
|
|
395
422
|
|
|
396
423
|
# Validate agent ID format (Claude Code requirements)
|
|
397
424
|
# Use agent_id for validation, not the display name
|
|
398
|
-
agent_id =
|
|
425
|
+
agent_id = frontmatter.get("agent_id", "")
|
|
399
426
|
if not self._is_valid_agent_name(agent_id):
|
|
400
427
|
self.logger.warning(
|
|
401
428
|
f"Invalid agent ID format in {template_file.name}: {agent_id}"
|
|
@@ -404,8 +431,10 @@ class AgentDiscoveryService:
|
|
|
404
431
|
|
|
405
432
|
return True
|
|
406
433
|
|
|
407
|
-
except
|
|
408
|
-
self.logger.error(
|
|
434
|
+
except yaml.YAMLError:
|
|
435
|
+
self.logger.error(
|
|
436
|
+
f"Invalid YAML frontmatter in template: {template_file.name}"
|
|
437
|
+
)
|
|
409
438
|
return False
|
|
410
439
|
except Exception as e:
|
|
411
440
|
self.logger.error(
|
|
@@ -431,25 +460,28 @@ class AgentDiscoveryService:
|
|
|
431
460
|
|
|
432
461
|
return bool(re.match(pattern, agent_name))
|
|
433
462
|
|
|
434
|
-
def
|
|
463
|
+
def _is_mpm_agent_with_config(
|
|
435
464
|
self, template_file: Path, config: Optional[Config] = None
|
|
436
465
|
) -> bool:
|
|
437
|
-
"""Check if agent is authored by Claude MPM team.
|
|
466
|
+
"""Check if agent is authored by Claude MPM team with configurable patterns.
|
|
438
467
|
|
|
439
468
|
MPM agents must have:
|
|
440
469
|
- An author field containing configurable MPM patterns (default: 'claude mpm', 'claude-mpm', 'anthropic')
|
|
441
|
-
- A valid
|
|
470
|
+
- A valid version field
|
|
442
471
|
|
|
443
472
|
Args:
|
|
444
|
-
template_file: Path to the agent template
|
|
473
|
+
template_file: Path to the agent template markdown file
|
|
445
474
|
config: Configuration object for MPM patterns
|
|
446
475
|
|
|
447
476
|
Returns:
|
|
448
477
|
True if this is an MPM agent, False otherwise
|
|
449
478
|
"""
|
|
450
479
|
try:
|
|
451
|
-
|
|
452
|
-
|
|
480
|
+
# Extract YAML frontmatter
|
|
481
|
+
content = template_file.read_text()
|
|
482
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
483
|
+
if not frontmatter:
|
|
484
|
+
return False
|
|
453
485
|
|
|
454
486
|
# Get MPM author patterns from config
|
|
455
487
|
if config:
|
|
@@ -461,13 +493,13 @@ class AgentDiscoveryService:
|
|
|
461
493
|
mpm_patterns = ["claude mpm", "claude-mpm", "anthropic"]
|
|
462
494
|
|
|
463
495
|
# Check for author field
|
|
464
|
-
author =
|
|
496
|
+
author = frontmatter.get("author", "").lower()
|
|
465
497
|
has_valid_author = any(
|
|
466
498
|
pattern.lower() in author for pattern in mpm_patterns
|
|
467
499
|
)
|
|
468
500
|
|
|
469
501
|
# Check for version field
|
|
470
|
-
has_version = bool(
|
|
502
|
+
has_version = bool(frontmatter.get("version"))
|
|
471
503
|
|
|
472
504
|
return has_valid_author and has_version
|
|
473
505
|
|
|
@@ -494,8 +526,8 @@ class AgentDiscoveryService:
|
|
|
494
526
|
if not self.templates_dir.exists():
|
|
495
527
|
return stats
|
|
496
528
|
|
|
497
|
-
# Count template files
|
|
498
|
-
template_files = list(self.templates_dir.glob("*.
|
|
529
|
+
# Count markdown template files
|
|
530
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
499
531
|
stats["total_templates"] = len(template_files)
|
|
500
532
|
|
|
501
533
|
# Validate each template
|
|
@@ -63,11 +63,7 @@ from .agent_operation_service import (
|
|
|
63
63
|
LifecycleOperationResult,
|
|
64
64
|
)
|
|
65
65
|
from .agent_record_service import AgentRecordService
|
|
66
|
-
from .agent_state_service import
|
|
67
|
-
AgentLifecycleRecord,
|
|
68
|
-
AgentStateService,
|
|
69
|
-
LifecycleState,
|
|
70
|
-
)
|
|
66
|
+
from .agent_state_service import AgentLifecycleRecord, AgentStateService, LifecycleState
|
|
71
67
|
|
|
72
68
|
# Re-export for backward compatibility
|
|
73
69
|
__all__ = [
|
|
@@ -10,10 +10,7 @@ from typing import TYPE_CHECKING, Optional
|
|
|
10
10
|
from claude_mpm.core.path_ops import path_ops
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
|
-
from .agent_lifecycle_manager import
|
|
14
|
-
AgentLifecycleManager,
|
|
15
|
-
LifecycleOperationResult,
|
|
16
|
-
)
|
|
13
|
+
from .agent_lifecycle_manager import AgentLifecycleManager, LifecycleOperationResult
|
|
17
14
|
|
|
18
15
|
|
|
19
16
|
class AgentRestoreHandler:
|