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
|
@@ -0,0 +1,774 @@
|
|
|
1
|
+
"""Agent source command handlers for managing Git-based agent repositories.
|
|
2
|
+
|
|
3
|
+
WHY: This module implements CLI commands for managing agent source repositories
|
|
4
|
+
(Git repositories containing agent markdown files). Provides add, remove, list, update,
|
|
5
|
+
enable, disable, and show commands with user-friendly output.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISION: Uses AgentSourceConfiguration for persistent storage and
|
|
8
|
+
GitSourceManager for Git operations. Provides clear, emoji-enhanced feedback
|
|
9
|
+
for better UX. Handles errors gracefully with actionable messages.
|
|
10
|
+
|
|
11
|
+
IMPLEMENTATION NOTE: This module is adapted from skill_source.py, following
|
|
12
|
+
the same proven patterns but for agent repositories instead of skills.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import logging
|
|
17
|
+
import re
|
|
18
|
+
|
|
19
|
+
from ...config.agent_sources import AgentSourceConfiguration
|
|
20
|
+
from ...models.git_repository import GitRepository
|
|
21
|
+
from ...services.agents.git_source_manager import GitSourceManager
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _test_repository_access(repo: GitRepository) -> dict:
|
|
27
|
+
"""Test if repository is accessible via GitHub API.
|
|
28
|
+
|
|
29
|
+
Design Decision: Test via GitHub API, not Git clone
|
|
30
|
+
|
|
31
|
+
Rationale: GitHub API is faster and less resource-intensive than
|
|
32
|
+
cloning the repository. We can validate access and existence without
|
|
33
|
+
downloading any files.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
repo: GitRepository to test
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Dictionary with:
|
|
40
|
+
- accessible: bool (True if repo can be reached)
|
|
41
|
+
- error: str (error message if not accessible)
|
|
42
|
+
|
|
43
|
+
Example:
|
|
44
|
+
>>> repo = GitRepository(url="https://github.com/owner/repo")
|
|
45
|
+
>>> result = _test_repository_access(repo)
|
|
46
|
+
>>> print(result["accessible"])
|
|
47
|
+
True
|
|
48
|
+
"""
|
|
49
|
+
import requests
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
# Parse GitHub URL to extract owner/repo
|
|
53
|
+
owner, repo_name = repo._parse_github_url(repo.url)
|
|
54
|
+
|
|
55
|
+
# Test GitHub API access
|
|
56
|
+
api_url = f"https://api.github.com/repos/{owner}/{repo_name}"
|
|
57
|
+
|
|
58
|
+
response = requests.get(api_url, timeout=10)
|
|
59
|
+
|
|
60
|
+
if response.status_code == 200:
|
|
61
|
+
return {"accessible": True, "error": None}
|
|
62
|
+
if response.status_code == 404:
|
|
63
|
+
return {
|
|
64
|
+
"accessible": False,
|
|
65
|
+
"error": f"Repository not found: {owner}/{repo_name}",
|
|
66
|
+
}
|
|
67
|
+
if response.status_code == 403:
|
|
68
|
+
return {
|
|
69
|
+
"accessible": False,
|
|
70
|
+
"error": "Access denied (private repository or rate limit)",
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
"accessible": False,
|
|
74
|
+
"error": f"HTTP {response.status_code}: {response.reason}",
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
except Exception as e:
|
|
78
|
+
return {"accessible": False, "error": str(e)}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _test_repository_sync(repo: GitRepository) -> dict:
|
|
82
|
+
"""Test syncing repository and discovering agents.
|
|
83
|
+
|
|
84
|
+
Design Decision: Use temporary cache for testing
|
|
85
|
+
|
|
86
|
+
Rationale: We want to test sync without polluting the main cache.
|
|
87
|
+
Use a temporary directory that gets cleaned up after testing.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
repo: GitRepository to test sync
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Dictionary with:
|
|
94
|
+
- synced: bool (True if sync successful)
|
|
95
|
+
- agents_discovered: list[str] (agent names found)
|
|
96
|
+
- error: str (error message if sync failed)
|
|
97
|
+
|
|
98
|
+
Example:
|
|
99
|
+
>>> repo = GitRepository(url="https://github.com/owner/repo")
|
|
100
|
+
>>> result = _test_repository_sync(repo)
|
|
101
|
+
>>> print(result["synced"])
|
|
102
|
+
True
|
|
103
|
+
>>> print(result["agents_discovered"])
|
|
104
|
+
['engineer', 'pm', 'research']
|
|
105
|
+
"""
|
|
106
|
+
import tempfile
|
|
107
|
+
from pathlib import Path
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
# Create temporary cache directory
|
|
111
|
+
with tempfile.TemporaryDirectory() as temp_cache:
|
|
112
|
+
temp_cache_path = Path(temp_cache)
|
|
113
|
+
|
|
114
|
+
# Override cache path for testing
|
|
115
|
+
original_cache_path = repo.cache_path
|
|
116
|
+
repo.cache_path = temp_cache_path / repo.identifier
|
|
117
|
+
|
|
118
|
+
# Sync repository
|
|
119
|
+
manager = GitSourceManager(cache_root=temp_cache_path)
|
|
120
|
+
sync_result = manager.sync_repository(repo, force=True, show_progress=False)
|
|
121
|
+
|
|
122
|
+
# Restore original cache path
|
|
123
|
+
repo.cache_path = original_cache_path
|
|
124
|
+
|
|
125
|
+
if not sync_result.get("synced"):
|
|
126
|
+
return {
|
|
127
|
+
"synced": False,
|
|
128
|
+
"agents_discovered": [],
|
|
129
|
+
"error": sync_result.get("error", "Unknown sync error"),
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
"synced": True,
|
|
134
|
+
"agents_discovered": sync_result.get("agents_discovered", []),
|
|
135
|
+
"error": None,
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
except Exception as e:
|
|
139
|
+
return {"synced": False, "agents_discovered": [], "error": str(e)}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _generate_source_id(url: str) -> str:
|
|
143
|
+
"""Generate source ID from Git URL.
|
|
144
|
+
|
|
145
|
+
Extracts repository name from various Git URL formats and sanitizes
|
|
146
|
+
it to create a valid identifier.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
url: Git repository URL
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
Source ID (sanitized repository name)
|
|
153
|
+
|
|
154
|
+
Examples:
|
|
155
|
+
https://github.com/owner/repo.git -> repo
|
|
156
|
+
https://github.com/owner/repo -> repo
|
|
157
|
+
git@github.com:owner/repo.git -> repo
|
|
158
|
+
"""
|
|
159
|
+
# Remove .git suffix
|
|
160
|
+
url_clean = url.rstrip("/").removesuffix(".git")
|
|
161
|
+
|
|
162
|
+
# Extract last path component (repo name)
|
|
163
|
+
if "://" in url_clean:
|
|
164
|
+
# HTTPS URL: https://github.com/owner/repo
|
|
165
|
+
repo_name = url_clean.split("/")[-1]
|
|
166
|
+
elif "@" in url_clean and ":" in url_clean:
|
|
167
|
+
# SSH URL: git@github.com:owner/repo
|
|
168
|
+
repo_name = url_clean.split(":")[-1].split("/")[-1]
|
|
169
|
+
else:
|
|
170
|
+
# Fallback: use last path component
|
|
171
|
+
repo_name = url_clean.split("/")[-1]
|
|
172
|
+
|
|
173
|
+
# Sanitize: only alphanumeric, dash, underscore
|
|
174
|
+
sanitized = re.sub(r"[^a-zA-Z0-9_-]", "-", repo_name)
|
|
175
|
+
|
|
176
|
+
# Remove leading/trailing dashes
|
|
177
|
+
sanitized = sanitized.strip("-")
|
|
178
|
+
|
|
179
|
+
return sanitized or "unnamed-repo"
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def agent_source_command(args) -> int:
|
|
183
|
+
"""Main entry point for agent-source commands.
|
|
184
|
+
|
|
185
|
+
Routes to appropriate handler based on subcommand.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
args: Parsed command arguments
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Exit code (0 = success, non-zero = error)
|
|
192
|
+
"""
|
|
193
|
+
handlers = {
|
|
194
|
+
"add": handle_add_agent_source,
|
|
195
|
+
"list": handle_list_agent_sources,
|
|
196
|
+
"remove": handle_remove_agent_source,
|
|
197
|
+
"update": handle_update_agent_sources,
|
|
198
|
+
"enable": handle_enable_agent_source,
|
|
199
|
+
"disable": handle_disable_agent_source,
|
|
200
|
+
"show": handle_show_agent_source,
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
handler = handlers.get(getattr(args, "agent_source_command", None))
|
|
204
|
+
if not handler:
|
|
205
|
+
print(f"❌ Unknown command: {getattr(args, 'agent_source_command', 'none')}")
|
|
206
|
+
print()
|
|
207
|
+
print("💡 Run 'claude-mpm agent-source --help' for available commands")
|
|
208
|
+
return 1
|
|
209
|
+
|
|
210
|
+
try:
|
|
211
|
+
return handler(args)
|
|
212
|
+
except Exception as e:
|
|
213
|
+
logger.error(f"Command failed: {e}", exc_info=True)
|
|
214
|
+
print(f"❌ Command failed: {e}")
|
|
215
|
+
return 1
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def handle_add_agent_source(args) -> int:
|
|
219
|
+
"""Add a new agent source with immediate testing.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
args: Parsed arguments with url, priority, branch, subdirectory, disabled, test, skip_test
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
Exit code
|
|
226
|
+
|
|
227
|
+
Design Decision: Immediate testing on add (fail-fast approach)
|
|
228
|
+
|
|
229
|
+
Rationale: Adding a repository that can't be accessed or synced leads to
|
|
230
|
+
broken state at startup. By testing immediately, we provide instant feedback
|
|
231
|
+
and prevent configuration pollution.
|
|
232
|
+
|
|
233
|
+
Test Mode Behavior:
|
|
234
|
+
- --test: Test only, don't save to configuration
|
|
235
|
+
- --no-test: Skip testing entirely (not recommended)
|
|
236
|
+
- Default: Test and save if successful
|
|
237
|
+
|
|
238
|
+
Testing Steps:
|
|
239
|
+
1. Validate repository URL format
|
|
240
|
+
2. Test Git access (can we reach the repository?)
|
|
241
|
+
3. Test sync (can we clone and discover agents?)
|
|
242
|
+
4. Report results with clear feedback
|
|
243
|
+
5. Save to configuration only if tests pass
|
|
244
|
+
"""
|
|
245
|
+
try:
|
|
246
|
+
# Load configuration
|
|
247
|
+
config = AgentSourceConfiguration.load()
|
|
248
|
+
|
|
249
|
+
# Generate source ID from URL
|
|
250
|
+
source_id = _generate_source_id(args.url)
|
|
251
|
+
|
|
252
|
+
# Check if already exists (by identifier)
|
|
253
|
+
for repo in config.repositories:
|
|
254
|
+
if repo.identifier == source_id or repo.url == args.url:
|
|
255
|
+
print(f"❌ Source '{repo.identifier}' already exists")
|
|
256
|
+
print(f" URL: {repo.url}")
|
|
257
|
+
print()
|
|
258
|
+
print(
|
|
259
|
+
f"💡 Remove it first: claude-mpm agent-source remove {repo.identifier}"
|
|
260
|
+
)
|
|
261
|
+
return 1
|
|
262
|
+
|
|
263
|
+
# Validate priority range
|
|
264
|
+
if args.priority < 0 or args.priority > 1000:
|
|
265
|
+
print("❌ Priority must be between 0 and 1000")
|
|
266
|
+
return 1
|
|
267
|
+
|
|
268
|
+
# Create new repository
|
|
269
|
+
enabled = not args.disabled
|
|
270
|
+
repo = GitRepository(
|
|
271
|
+
url=args.url,
|
|
272
|
+
subdirectory=args.subdirectory,
|
|
273
|
+
priority=args.priority,
|
|
274
|
+
enabled=enabled,
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
# Validate repository
|
|
278
|
+
errors = repo.validate()
|
|
279
|
+
if errors:
|
|
280
|
+
print("❌ Invalid repository configuration:")
|
|
281
|
+
for error in errors:
|
|
282
|
+
print(f" - {error}")
|
|
283
|
+
return 1
|
|
284
|
+
|
|
285
|
+
# Determine if we should test
|
|
286
|
+
test_mode = getattr(args, "test", False)
|
|
287
|
+
skip_test = getattr(args, "skip_test", False)
|
|
288
|
+
|
|
289
|
+
# Test repository access unless explicitly skipped
|
|
290
|
+
if not skip_test:
|
|
291
|
+
print(f"🔍 Testing repository access: {args.url}")
|
|
292
|
+
print()
|
|
293
|
+
|
|
294
|
+
test_result = _test_repository_access(repo)
|
|
295
|
+
|
|
296
|
+
if not test_result["accessible"]:
|
|
297
|
+
print(f"❌ Repository not accessible: {test_result['error']}")
|
|
298
|
+
print()
|
|
299
|
+
print("💡 Check the URL and try again")
|
|
300
|
+
return 1
|
|
301
|
+
|
|
302
|
+
print("✅ Repository accessible")
|
|
303
|
+
|
|
304
|
+
# Test sync and discovery
|
|
305
|
+
print("🔍 Testing sync and agent discovery...")
|
|
306
|
+
print()
|
|
307
|
+
|
|
308
|
+
sync_result = _test_repository_sync(repo)
|
|
309
|
+
|
|
310
|
+
if not sync_result["synced"]:
|
|
311
|
+
print(f"❌ Sync failed: {sync_result['error']}")
|
|
312
|
+
print()
|
|
313
|
+
print("💡 Repository may be valid but sync failed")
|
|
314
|
+
print(
|
|
315
|
+
" You can still add it with --no-test if you want to troubleshoot later"
|
|
316
|
+
)
|
|
317
|
+
return 1
|
|
318
|
+
|
|
319
|
+
agents_count = len(sync_result.get("agents_discovered", []))
|
|
320
|
+
print("✅ Sync successful")
|
|
321
|
+
print(f" Discovered {agents_count} agents")
|
|
322
|
+
|
|
323
|
+
if agents_count > 0:
|
|
324
|
+
print()
|
|
325
|
+
print(" Agents found:")
|
|
326
|
+
for agent_name in sync_result["agents_discovered"][:5]:
|
|
327
|
+
print(f" - {agent_name}")
|
|
328
|
+
if agents_count > 5:
|
|
329
|
+
print(f" ... and {agents_count - 5} more")
|
|
330
|
+
|
|
331
|
+
print()
|
|
332
|
+
|
|
333
|
+
# If test mode, stop here
|
|
334
|
+
if test_mode:
|
|
335
|
+
print("✅ Test complete - repository is valid and accessible")
|
|
336
|
+
print()
|
|
337
|
+
print("💡 To add this repository, run without --test flag:")
|
|
338
|
+
print(f" claude-mpm agent-source add {args.url}")
|
|
339
|
+
return 0
|
|
340
|
+
|
|
341
|
+
# Check for priority conflicts
|
|
342
|
+
conflicts = [r for r in config.repositories if r.priority == args.priority]
|
|
343
|
+
if conflicts:
|
|
344
|
+
print("⚠️ Priority conflict detected:")
|
|
345
|
+
for conflict_repo in conflicts:
|
|
346
|
+
print(
|
|
347
|
+
f" Repository '{conflict_repo.identifier}' has the same priority"
|
|
348
|
+
)
|
|
349
|
+
print()
|
|
350
|
+
print("💡 Lower priority number = higher precedence")
|
|
351
|
+
|
|
352
|
+
# Add repository
|
|
353
|
+
config.add_repository(repo)
|
|
354
|
+
config.save()
|
|
355
|
+
|
|
356
|
+
# Success message
|
|
357
|
+
status_emoji = "✅" if enabled else "⚠️ "
|
|
358
|
+
status_text = "enabled" if enabled else "disabled"
|
|
359
|
+
print(f"{status_emoji} Added agent source: {repo.identifier}")
|
|
360
|
+
print(f" URL: {args.url}")
|
|
361
|
+
if args.subdirectory:
|
|
362
|
+
print(f" Subdirectory: {args.subdirectory}")
|
|
363
|
+
print(f" Priority: {args.priority}")
|
|
364
|
+
print(f" Status: {status_text}")
|
|
365
|
+
print()
|
|
366
|
+
|
|
367
|
+
if enabled:
|
|
368
|
+
print("💡 Repository configured and tested successfully")
|
|
369
|
+
print(" Agents from this source will be available on next startup")
|
|
370
|
+
else:
|
|
371
|
+
print(f"💡 Enable it: claude-mpm agent-source enable {repo.identifier}")
|
|
372
|
+
|
|
373
|
+
return 0
|
|
374
|
+
|
|
375
|
+
except Exception as e:
|
|
376
|
+
logger.error(f"Failed to add agent source: {e}", exc_info=True)
|
|
377
|
+
print(f"❌ Failed to add agent source: {e}")
|
|
378
|
+
return 1
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
def handle_list_agent_sources(args) -> int:
|
|
382
|
+
"""List configured agent sources.
|
|
383
|
+
|
|
384
|
+
Args:
|
|
385
|
+
args: Parsed arguments with by_priority, enabled_only, json
|
|
386
|
+
|
|
387
|
+
Returns:
|
|
388
|
+
Exit code
|
|
389
|
+
"""
|
|
390
|
+
try:
|
|
391
|
+
config = AgentSourceConfiguration.load()
|
|
392
|
+
repositories = config.repositories.copy()
|
|
393
|
+
|
|
394
|
+
# Add system repository if not disabled
|
|
395
|
+
system_repo = config.get_system_repo()
|
|
396
|
+
all_repos = []
|
|
397
|
+
if system_repo:
|
|
398
|
+
all_repos.append(system_repo)
|
|
399
|
+
all_repos.extend(repositories)
|
|
400
|
+
|
|
401
|
+
# Filter if requested
|
|
402
|
+
if args.enabled_only:
|
|
403
|
+
all_repos = [r for r in all_repos if r.enabled]
|
|
404
|
+
|
|
405
|
+
# Sort if requested
|
|
406
|
+
if args.by_priority:
|
|
407
|
+
all_repos = sorted(all_repos, key=lambda r: r.priority)
|
|
408
|
+
|
|
409
|
+
# Output format
|
|
410
|
+
if args.json:
|
|
411
|
+
# JSON output
|
|
412
|
+
output = [
|
|
413
|
+
{
|
|
414
|
+
"identifier": r.identifier,
|
|
415
|
+
"url": r.url,
|
|
416
|
+
"subdirectory": r.subdirectory,
|
|
417
|
+
"priority": r.priority,
|
|
418
|
+
"enabled": r.enabled,
|
|
419
|
+
}
|
|
420
|
+
for r in all_repos
|
|
421
|
+
]
|
|
422
|
+
print(json.dumps(output, indent=2))
|
|
423
|
+
else:
|
|
424
|
+
# Human-readable output
|
|
425
|
+
if not all_repos:
|
|
426
|
+
print("📚 No agent sources configured")
|
|
427
|
+
print()
|
|
428
|
+
print("💡 Add a source: claude-mpm agent-source add <git-url>")
|
|
429
|
+
return 0
|
|
430
|
+
|
|
431
|
+
filter_text = " (enabled only)" if args.enabled_only else ""
|
|
432
|
+
print(f"📚 Configured Agent Sources ({len(all_repos)} total{filter_text}):")
|
|
433
|
+
print()
|
|
434
|
+
|
|
435
|
+
for repo in all_repos:
|
|
436
|
+
status = "✅" if repo.enabled else "❌"
|
|
437
|
+
status_text = "Enabled" if repo.enabled else "Disabled"
|
|
438
|
+
is_system = repo.url == "https://github.com/bobmatnyc/claude-mpm-agents"
|
|
439
|
+
system_tag = " [System]" if is_system else ""
|
|
440
|
+
|
|
441
|
+
print(f" {status} {repo.identifier}{system_tag} ({status_text})")
|
|
442
|
+
print(f" URL: {repo.url}")
|
|
443
|
+
if repo.subdirectory:
|
|
444
|
+
print(f" Subdirectory: {repo.subdirectory}")
|
|
445
|
+
print(f" Priority: {repo.priority}")
|
|
446
|
+
print()
|
|
447
|
+
|
|
448
|
+
return 0
|
|
449
|
+
|
|
450
|
+
except Exception as e:
|
|
451
|
+
logger.error(f"Failed to list agent sources: {e}", exc_info=True)
|
|
452
|
+
print(f"❌ Failed to list agent sources: {e}")
|
|
453
|
+
return 1
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
def handle_remove_agent_source(args) -> int:
|
|
457
|
+
"""Remove an agent source.
|
|
458
|
+
|
|
459
|
+
Args:
|
|
460
|
+
args: Parsed arguments with source_id, force
|
|
461
|
+
|
|
462
|
+
Returns:
|
|
463
|
+
Exit code
|
|
464
|
+
"""
|
|
465
|
+
try:
|
|
466
|
+
config = AgentSourceConfiguration.load()
|
|
467
|
+
|
|
468
|
+
# Find repository by identifier
|
|
469
|
+
repo_to_remove = None
|
|
470
|
+
for repo in config.repositories:
|
|
471
|
+
if repo.identifier == args.source_id:
|
|
472
|
+
repo_to_remove = repo
|
|
473
|
+
break
|
|
474
|
+
|
|
475
|
+
if not repo_to_remove:
|
|
476
|
+
print(f"❌ Source not found: {args.source_id}")
|
|
477
|
+
print()
|
|
478
|
+
print("💡 List sources: claude-mpm agent-source list")
|
|
479
|
+
return 1
|
|
480
|
+
|
|
481
|
+
# Confirmation prompt unless --force
|
|
482
|
+
if not args.force:
|
|
483
|
+
print(f"⚠️ Remove agent source: {args.source_id}")
|
|
484
|
+
print(f" URL: {repo_to_remove.url}")
|
|
485
|
+
print()
|
|
486
|
+
response = input(" Continue? (y/N): ").strip().lower()
|
|
487
|
+
if response not in ("y", "yes"):
|
|
488
|
+
print()
|
|
489
|
+
print("❌ Cancelled")
|
|
490
|
+
return 0
|
|
491
|
+
|
|
492
|
+
# Remove repository
|
|
493
|
+
config.remove_repository(args.source_id)
|
|
494
|
+
config.save()
|
|
495
|
+
|
|
496
|
+
print()
|
|
497
|
+
print(f"✅ Removed agent source: {args.source_id}")
|
|
498
|
+
|
|
499
|
+
return 0
|
|
500
|
+
|
|
501
|
+
except Exception as e:
|
|
502
|
+
logger.error(f"Failed to remove agent source: {e}", exc_info=True)
|
|
503
|
+
print(f"❌ Failed to remove agent source: {e}")
|
|
504
|
+
return 1
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
def handle_update_agent_sources(args) -> int:
|
|
508
|
+
"""Update (sync) agent sources.
|
|
509
|
+
|
|
510
|
+
Args:
|
|
511
|
+
args: Parsed arguments with source_id (optional), force
|
|
512
|
+
|
|
513
|
+
Returns:
|
|
514
|
+
Exit code
|
|
515
|
+
"""
|
|
516
|
+
try:
|
|
517
|
+
config = AgentSourceConfiguration.load()
|
|
518
|
+
manager = GitSourceManager()
|
|
519
|
+
|
|
520
|
+
if args.source_id:
|
|
521
|
+
# Update specific source
|
|
522
|
+
print(f"🔄 Updating agent source: {args.source_id}")
|
|
523
|
+
|
|
524
|
+
# Find repository
|
|
525
|
+
repo_to_sync = None
|
|
526
|
+
for repo in config.repositories:
|
|
527
|
+
if repo.identifier == args.source_id:
|
|
528
|
+
repo_to_sync = repo
|
|
529
|
+
break
|
|
530
|
+
|
|
531
|
+
# Check system repo
|
|
532
|
+
if not repo_to_sync:
|
|
533
|
+
system_repo = config.get_system_repo()
|
|
534
|
+
if system_repo and system_repo.identifier == args.source_id:
|
|
535
|
+
repo_to_sync = system_repo
|
|
536
|
+
|
|
537
|
+
if not repo_to_sync:
|
|
538
|
+
print(f"❌ Source not found: {args.source_id}")
|
|
539
|
+
print()
|
|
540
|
+
print("💡 List sources: claude-mpm agent-source list")
|
|
541
|
+
return 1
|
|
542
|
+
|
|
543
|
+
# Sync repository
|
|
544
|
+
result = manager.sync_repository(repo_to_sync, force=args.force)
|
|
545
|
+
|
|
546
|
+
if result.get("synced"):
|
|
547
|
+
print(f"✅ Successfully updated {args.source_id}")
|
|
548
|
+
agents_count = len(result.get("agents_discovered", []))
|
|
549
|
+
print(f" Agents discovered: {agents_count}")
|
|
550
|
+
|
|
551
|
+
if agents_count > 0:
|
|
552
|
+
print()
|
|
553
|
+
print(
|
|
554
|
+
f"💡 View agents: claude-mpm agent-source show {args.source_id} --agents"
|
|
555
|
+
)
|
|
556
|
+
else:
|
|
557
|
+
print(f"❌ Failed to update {args.source_id}")
|
|
558
|
+
error_msg = result.get("error", "Unknown error")
|
|
559
|
+
print(f" Error: {error_msg}")
|
|
560
|
+
return 1
|
|
561
|
+
else:
|
|
562
|
+
# Update all enabled sources
|
|
563
|
+
print("🔄 Updating all agent sources...")
|
|
564
|
+
enabled_repos = config.get_enabled_repositories()
|
|
565
|
+
|
|
566
|
+
if not enabled_repos:
|
|
567
|
+
print("⚠️ No enabled agent sources to update")
|
|
568
|
+
print()
|
|
569
|
+
print("💡 Add a source: claude-mpm agent-source add <git-url>")
|
|
570
|
+
return 0
|
|
571
|
+
|
|
572
|
+
results = manager.sync_all_repositories(enabled_repos, force=args.force)
|
|
573
|
+
|
|
574
|
+
success_count = sum(1 for r in results.values() if r.get("synced"))
|
|
575
|
+
total_count = len(results)
|
|
576
|
+
|
|
577
|
+
print()
|
|
578
|
+
print(f"✅ Updated {success_count}/{total_count} sources")
|
|
579
|
+
print()
|
|
580
|
+
|
|
581
|
+
for repo_id, result in results.items():
|
|
582
|
+
if result.get("synced"):
|
|
583
|
+
agents_count = len(result.get("agents_discovered", []))
|
|
584
|
+
print(f" ✅ {repo_id}: {agents_count} agents")
|
|
585
|
+
else:
|
|
586
|
+
error_msg = result.get("error", "Unknown error")
|
|
587
|
+
print(f" ❌ {repo_id}: {error_msg}")
|
|
588
|
+
|
|
589
|
+
if success_count > 0:
|
|
590
|
+
print()
|
|
591
|
+
print("💡 List agents: claude-mpm agents list --remote")
|
|
592
|
+
|
|
593
|
+
return 0
|
|
594
|
+
|
|
595
|
+
except Exception as e:
|
|
596
|
+
logger.error(f"Failed to update agent sources: {e}", exc_info=True)
|
|
597
|
+
print(f"❌ Failed to update agent sources: {e}")
|
|
598
|
+
return 1
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
def handle_enable_agent_source(args) -> int:
|
|
602
|
+
"""Enable an agent source.
|
|
603
|
+
|
|
604
|
+
Args:
|
|
605
|
+
args: Parsed arguments with source_id
|
|
606
|
+
|
|
607
|
+
Returns:
|
|
608
|
+
Exit code
|
|
609
|
+
"""
|
|
610
|
+
try:
|
|
611
|
+
config = AgentSourceConfiguration.load()
|
|
612
|
+
|
|
613
|
+
# Find repository
|
|
614
|
+
repo_to_enable = None
|
|
615
|
+
for repo in config.repositories:
|
|
616
|
+
if repo.identifier == args.source_id:
|
|
617
|
+
repo_to_enable = repo
|
|
618
|
+
break
|
|
619
|
+
|
|
620
|
+
if not repo_to_enable:
|
|
621
|
+
print(f"❌ Source not found: {args.source_id}")
|
|
622
|
+
print()
|
|
623
|
+
print("💡 List sources: claude-mpm agent-source list")
|
|
624
|
+
return 1
|
|
625
|
+
|
|
626
|
+
if repo_to_enable.enabled:
|
|
627
|
+
print(f"⚠️ Source '{args.source_id}' is already enabled")
|
|
628
|
+
return 0
|
|
629
|
+
|
|
630
|
+
# Enable repository
|
|
631
|
+
repo_to_enable.enabled = True
|
|
632
|
+
config.save()
|
|
633
|
+
|
|
634
|
+
print(f"✅ Enabled agent source: {args.source_id}")
|
|
635
|
+
print()
|
|
636
|
+
print(f"💡 Sync agents: claude-mpm agent-source update {args.source_id}")
|
|
637
|
+
|
|
638
|
+
return 0
|
|
639
|
+
|
|
640
|
+
except Exception as e:
|
|
641
|
+
logger.error(f"Failed to enable agent source: {e}", exc_info=True)
|
|
642
|
+
print(f"❌ Failed to enable agent source: {e}")
|
|
643
|
+
return 1
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
def handle_disable_agent_source(args) -> int:
|
|
647
|
+
"""Disable an agent source.
|
|
648
|
+
|
|
649
|
+
Args:
|
|
650
|
+
args: Parsed arguments with source_id
|
|
651
|
+
|
|
652
|
+
Returns:
|
|
653
|
+
Exit code
|
|
654
|
+
"""
|
|
655
|
+
try:
|
|
656
|
+
config = AgentSourceConfiguration.load()
|
|
657
|
+
|
|
658
|
+
# Find repository
|
|
659
|
+
repo_to_disable = None
|
|
660
|
+
for repo in config.repositories:
|
|
661
|
+
if repo.identifier == args.source_id:
|
|
662
|
+
repo_to_disable = repo
|
|
663
|
+
break
|
|
664
|
+
|
|
665
|
+
if not repo_to_disable:
|
|
666
|
+
print(f"❌ Source not found: {args.source_id}")
|
|
667
|
+
print()
|
|
668
|
+
print("💡 List sources: claude-mpm agent-source list")
|
|
669
|
+
return 1
|
|
670
|
+
|
|
671
|
+
if not repo_to_disable.enabled:
|
|
672
|
+
print(f"⚠️ Source '{args.source_id}' is already disabled")
|
|
673
|
+
return 0
|
|
674
|
+
|
|
675
|
+
# Disable repository
|
|
676
|
+
repo_to_disable.enabled = False
|
|
677
|
+
config.save()
|
|
678
|
+
|
|
679
|
+
print(f"✅ Disabled agent source: {args.source_id}")
|
|
680
|
+
print(" Agents from this source will not be available")
|
|
681
|
+
print()
|
|
682
|
+
print(f"💡 Re-enable: claude-mpm agent-source enable {args.source_id}")
|
|
683
|
+
|
|
684
|
+
return 0
|
|
685
|
+
|
|
686
|
+
except Exception as e:
|
|
687
|
+
logger.error(f"Failed to disable agent source: {e}", exc_info=True)
|
|
688
|
+
print(f"❌ Failed to disable agent source: {e}")
|
|
689
|
+
return 1
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
def handle_show_agent_source(args) -> int:
|
|
693
|
+
"""Show detailed information about an agent source.
|
|
694
|
+
|
|
695
|
+
Args:
|
|
696
|
+
args: Parsed arguments with source_id, agents
|
|
697
|
+
|
|
698
|
+
Returns:
|
|
699
|
+
Exit code
|
|
700
|
+
"""
|
|
701
|
+
try:
|
|
702
|
+
config = AgentSourceConfiguration.load()
|
|
703
|
+
|
|
704
|
+
# Find repository
|
|
705
|
+
repo_to_show = None
|
|
706
|
+
for repo in config.repositories:
|
|
707
|
+
if repo.identifier == args.source_id:
|
|
708
|
+
repo_to_show = repo
|
|
709
|
+
break
|
|
710
|
+
|
|
711
|
+
# Check system repo
|
|
712
|
+
if not repo_to_show:
|
|
713
|
+
system_repo = config.get_system_repo()
|
|
714
|
+
if system_repo and system_repo.identifier == args.source_id:
|
|
715
|
+
repo_to_show = system_repo
|
|
716
|
+
|
|
717
|
+
if not repo_to_show:
|
|
718
|
+
print(f"❌ Source not found: {args.source_id}")
|
|
719
|
+
print()
|
|
720
|
+
print("💡 List sources: claude-mpm agent-source list")
|
|
721
|
+
return 1
|
|
722
|
+
|
|
723
|
+
# Display repository details
|
|
724
|
+
status_emoji = "✅" if repo_to_show.enabled else "❌"
|
|
725
|
+
status_text = "Enabled" if repo_to_show.enabled else "Disabled"
|
|
726
|
+
is_system = repo_to_show.url == "https://github.com/bobmatnyc/claude-mpm-agents"
|
|
727
|
+
|
|
728
|
+
print()
|
|
729
|
+
print(f"📚 Agent Source: {repo_to_show.identifier}")
|
|
730
|
+
if is_system:
|
|
731
|
+
print(" [System Repository]")
|
|
732
|
+
print()
|
|
733
|
+
print(f" Status: {status_emoji} {status_text}")
|
|
734
|
+
print(f" URL: {repo_to_show.url}")
|
|
735
|
+
if repo_to_show.subdirectory:
|
|
736
|
+
print(f" Subdirectory: {repo_to_show.subdirectory}")
|
|
737
|
+
print(f" Priority: {repo_to_show.priority}")
|
|
738
|
+
print()
|
|
739
|
+
|
|
740
|
+
# Optionally list agents from this source
|
|
741
|
+
if args.agents:
|
|
742
|
+
try:
|
|
743
|
+
manager = GitSourceManager()
|
|
744
|
+
all_agents = manager.list_cached_agents(repo_identifier=args.source_id)
|
|
745
|
+
|
|
746
|
+
if all_agents:
|
|
747
|
+
print(f" Agents ({len(all_agents)}):")
|
|
748
|
+
print()
|
|
749
|
+
for agent in all_agents:
|
|
750
|
+
name = agent.get("metadata", {}).get(
|
|
751
|
+
"name", agent.get("agent_id", "unknown")
|
|
752
|
+
)
|
|
753
|
+
print(f" - {name}")
|
|
754
|
+
version = agent.get("metadata", {}).get("version")
|
|
755
|
+
if version:
|
|
756
|
+
print(f" Version: {version}")
|
|
757
|
+
print()
|
|
758
|
+
else:
|
|
759
|
+
print(" No agents found in this source")
|
|
760
|
+
print()
|
|
761
|
+
print(
|
|
762
|
+
f"💡 Sync source: claude-mpm agent-source update {args.source_id}"
|
|
763
|
+
)
|
|
764
|
+
except Exception as e:
|
|
765
|
+
logger.warning(f"Failed to load agents: {e}")
|
|
766
|
+
print(f" ⚠️ Could not load agents: {e}")
|
|
767
|
+
print()
|
|
768
|
+
|
|
769
|
+
return 0
|
|
770
|
+
|
|
771
|
+
except Exception as e:
|
|
772
|
+
logger.error(f"Failed to show agent source: {e}", exc_info=True)
|
|
773
|
+
print(f"❌ Failed to show agent source: {e}")
|
|
774
|
+
return 1
|