claude-mpm 4.21.0__py3-none-any.whl → 5.0.2__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- 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 +38 -2
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +125 -20
- claude_mpm/cli/commands/agents.py +684 -13
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +2 -6
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +478 -44
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +50 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +435 -1
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +919 -41
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +173 -4
- claude_mpm/cli/parsers/base_parser.py +49 -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 +138 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +499 -84
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/{mpm-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 +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-session-resume.md +381 -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 +11 -0
- claude_mpm/config/agent_presets.py +258 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +12 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +17 -10
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +112 -5
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +94 -4
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -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/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- 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/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +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/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +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 +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- 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 +1055 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +92 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +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/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- 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/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/progress.py +383 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -180
- 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 -211
- 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/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -140
- 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 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/ticketing.json +0 -177
- 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 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/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/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/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
|
@@ -15,6 +15,8 @@ import json
|
|
|
15
15
|
from pathlib import Path
|
|
16
16
|
from typing import Dict, List, Optional
|
|
17
17
|
|
|
18
|
+
import questionary
|
|
19
|
+
from questionary import Style
|
|
18
20
|
from rich.console import Console
|
|
19
21
|
from rich.prompt import Confirm, Prompt
|
|
20
22
|
from rich.text import Text
|
|
@@ -41,6 +43,16 @@ from .configure_validators import (
|
|
|
41
43
|
class ConfigureCommand(BaseCommand):
|
|
42
44
|
"""Interactive configuration management command."""
|
|
43
45
|
|
|
46
|
+
# Questionary style matching Rich cyan theme
|
|
47
|
+
QUESTIONARY_STYLE = Style(
|
|
48
|
+
[
|
|
49
|
+
("selected", "fg:cyan bold"),
|
|
50
|
+
("pointer", "fg:cyan bold"),
|
|
51
|
+
("highlighted", "fg:cyan"),
|
|
52
|
+
("question", "fg:cyan bold"),
|
|
53
|
+
]
|
|
54
|
+
)
|
|
55
|
+
|
|
44
56
|
def __init__(self):
|
|
45
57
|
super().__init__("configure")
|
|
46
58
|
self.console = default_console
|
|
@@ -284,61 +296,98 @@ class ConfigureCommand(BaseCommand):
|
|
|
284
296
|
return self.navigation.show_main_menu()
|
|
285
297
|
|
|
286
298
|
def _manage_agents(self) -> None:
|
|
287
|
-
"""
|
|
299
|
+
"""Enhanced agent management with remote agent discovery and deployment."""
|
|
288
300
|
while True:
|
|
289
301
|
self.console.clear()
|
|
290
|
-
self.
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
self.
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
302
|
+
self.navigation.display_header()
|
|
303
|
+
self.console.print("\n[bold blue]═══ Agent Management ═══[/bold blue]\n")
|
|
304
|
+
|
|
305
|
+
# Step 1: Show configured sources
|
|
306
|
+
self.console.print("[bold cyan]═══ Agent Sources ═══[/bold cyan]\n")
|
|
307
|
+
|
|
308
|
+
sources = self._get_configured_sources()
|
|
309
|
+
if sources:
|
|
310
|
+
from rich.table import Table
|
|
311
|
+
|
|
312
|
+
sources_table = Table(show_header=True, header_style="bold cyan")
|
|
313
|
+
sources_table.add_column("Source", style="cyan", width=40)
|
|
314
|
+
sources_table.add_column("Status", style="green", width=15)
|
|
315
|
+
sources_table.add_column("Agents", style="yellow", width=10)
|
|
316
|
+
|
|
317
|
+
for source in sources:
|
|
318
|
+
status = "✓ Active" if source.get("enabled", True) else "Disabled"
|
|
319
|
+
agent_count = source.get("agent_count", "?")
|
|
320
|
+
sources_table.add_row(
|
|
321
|
+
source["identifier"], status, str(agent_count)
|
|
322
|
+
)
|
|
298
323
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
324
|
+
self.console.print(sources_table)
|
|
325
|
+
else:
|
|
326
|
+
self.console.print("[yellow]No agent sources configured[/yellow]")
|
|
327
|
+
self.console.print(
|
|
328
|
+
"[dim]Default source 'bobmatnyc/claude-mpm-agents' will be used[/dim]\n"
|
|
329
|
+
)
|
|
304
330
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
text_c.append(" Customize agent template")
|
|
308
|
-
self.console.print(text_c)
|
|
331
|
+
# Step 2: Discover and display available agents
|
|
332
|
+
self.console.print("\n[bold cyan]═══ Available Agents ═══[/bold cyan]\n")
|
|
309
333
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
self.console.print(text_v)
|
|
334
|
+
try:
|
|
335
|
+
# Discover agents (includes both local and remote)
|
|
336
|
+
agents = self.agent_manager.discover_agents(include_remote=True)
|
|
314
337
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
338
|
+
if not agents:
|
|
339
|
+
self.console.print("[yellow]No agents found[/yellow]")
|
|
340
|
+
self.console.print(
|
|
341
|
+
"[dim]Configure sources with 'claude-mpm agent-source add'[/dim]\n"
|
|
342
|
+
)
|
|
343
|
+
else:
|
|
344
|
+
# Display agents in a table
|
|
345
|
+
self._display_agents_with_source_info(agents)
|
|
319
346
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
self.console.print(text_b)
|
|
347
|
+
except Exception as e:
|
|
348
|
+
self.console.print(f"[red]Error discovering agents: {e}[/red]")
|
|
349
|
+
self.logger.error(f"Agent discovery failed: {e}", exc_info=True)
|
|
324
350
|
|
|
351
|
+
# Step 3: Menu options with arrow-key navigation
|
|
325
352
|
self.console.print()
|
|
353
|
+
try:
|
|
354
|
+
choice = questionary.select(
|
|
355
|
+
"Agent Management:",
|
|
356
|
+
choices=[
|
|
357
|
+
"Manage sources (add/remove repositories)",
|
|
358
|
+
"Deploy agents (individual selection)",
|
|
359
|
+
"Deploy preset (predefined sets)",
|
|
360
|
+
"Remove agents",
|
|
361
|
+
"View agent details",
|
|
362
|
+
"Toggle agents (legacy enable/disable)",
|
|
363
|
+
questionary.Separator(),
|
|
364
|
+
"← Back to main menu",
|
|
365
|
+
],
|
|
366
|
+
style=self.QUESTIONARY_STYLE,
|
|
367
|
+
).ask()
|
|
368
|
+
|
|
369
|
+
if choice is None or choice == "← Back to main menu":
|
|
370
|
+
break
|
|
326
371
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
372
|
+
agents_var = agents if "agents" in locals() else []
|
|
373
|
+
|
|
374
|
+
# Map selection to action
|
|
375
|
+
if choice == "Manage sources (add/remove repositories)":
|
|
376
|
+
self._manage_sources()
|
|
377
|
+
elif choice == "Deploy agents (individual selection)":
|
|
378
|
+
self._deploy_agents_individual(agents_var)
|
|
379
|
+
elif choice == "Deploy preset (predefined sets)":
|
|
380
|
+
self._deploy_agents_preset()
|
|
381
|
+
elif choice == "Remove agents":
|
|
382
|
+
self._remove_agents(agents_var)
|
|
383
|
+
elif choice == "View agent details":
|
|
384
|
+
self._view_agent_details_enhanced(agents_var)
|
|
385
|
+
elif choice == "Toggle agents (legacy enable/disable)":
|
|
386
|
+
self._toggle_agents_interactive(agents_var)
|
|
387
|
+
|
|
388
|
+
except KeyboardInterrupt:
|
|
389
|
+
self.console.print("\n[yellow]Operation cancelled[/yellow]")
|
|
330
390
|
break
|
|
331
|
-
if choice == "t":
|
|
332
|
-
self._toggle_agents_interactive(agents)
|
|
333
|
-
elif choice == "c":
|
|
334
|
-
self._customize_agent_template(agents)
|
|
335
|
-
elif choice == "v":
|
|
336
|
-
self._view_agent_details(agents)
|
|
337
|
-
elif choice == "r":
|
|
338
|
-
self._reset_agent_defaults(agents)
|
|
339
|
-
else:
|
|
340
|
-
self.console.print("[red]Invalid choice.[/red]")
|
|
341
|
-
Prompt.ask("Press Enter to continue")
|
|
342
391
|
|
|
343
392
|
def _display_agents_table(self, agents: List[AgentConfig]) -> None:
|
|
344
393
|
"""Display a table of available agents."""
|
|
@@ -809,6 +858,391 @@ class ConfigureCommand(BaseCommand):
|
|
|
809
858
|
except Exception as e:
|
|
810
859
|
return CommandResult.error_result(f"Startup configuration failed: {e}")
|
|
811
860
|
|
|
861
|
+
# ========================================================================
|
|
862
|
+
# Enhanced Agent Management Methods (Remote Agent Discovery Integration)
|
|
863
|
+
# ========================================================================
|
|
864
|
+
|
|
865
|
+
def _get_configured_sources(self) -> List[Dict]:
|
|
866
|
+
"""Get list of configured agent sources with agent counts."""
|
|
867
|
+
try:
|
|
868
|
+
from claude_mpm.config.agent_sources import AgentSourceConfiguration
|
|
869
|
+
|
|
870
|
+
config = AgentSourceConfiguration.load()
|
|
871
|
+
|
|
872
|
+
# Convert repositories to source dictionaries
|
|
873
|
+
sources = []
|
|
874
|
+
for repo in config.repositories:
|
|
875
|
+
# Extract identifier from repository
|
|
876
|
+
identifier = repo.identifier
|
|
877
|
+
|
|
878
|
+
# Count agents in cache
|
|
879
|
+
cache_dir = (
|
|
880
|
+
Path.home() / ".claude-mpm" / "cache" / "remote-agents" / identifier
|
|
881
|
+
)
|
|
882
|
+
agent_count = 0
|
|
883
|
+
if cache_dir.exists():
|
|
884
|
+
agents_dir = cache_dir / "agents"
|
|
885
|
+
if agents_dir.exists():
|
|
886
|
+
agent_count = len(list(agents_dir.rglob("*.md")))
|
|
887
|
+
|
|
888
|
+
sources.append(
|
|
889
|
+
{
|
|
890
|
+
"identifier": identifier,
|
|
891
|
+
"url": repo.url,
|
|
892
|
+
"enabled": repo.enabled,
|
|
893
|
+
"priority": repo.priority,
|
|
894
|
+
"agent_count": agent_count,
|
|
895
|
+
}
|
|
896
|
+
)
|
|
897
|
+
|
|
898
|
+
return sources
|
|
899
|
+
except Exception as e:
|
|
900
|
+
self.logger.warning(f"Failed to get configured sources: {e}")
|
|
901
|
+
return []
|
|
902
|
+
|
|
903
|
+
def _display_agents_with_source_info(self, agents: List[AgentConfig]) -> None:
|
|
904
|
+
"""Display agents table with source information and deployment status."""
|
|
905
|
+
from rich.table import Table
|
|
906
|
+
|
|
907
|
+
agents_table = Table(show_header=True, header_style="bold cyan")
|
|
908
|
+
agents_table.add_column("#", style="dim", width=4)
|
|
909
|
+
agents_table.add_column("Agent ID", style="cyan", width=35)
|
|
910
|
+
agents_table.add_column("Name", style="green", width=25)
|
|
911
|
+
agents_table.add_column("Source", style="yellow", width=15)
|
|
912
|
+
agents_table.add_column("Status", style="magenta", width=12)
|
|
913
|
+
|
|
914
|
+
for idx, agent in enumerate(agents, 1):
|
|
915
|
+
# Determine source type
|
|
916
|
+
source_type = getattr(agent, "source_type", "local")
|
|
917
|
+
source_label = "Remote" if source_type == "remote" else "Local"
|
|
918
|
+
|
|
919
|
+
# Determine deployment status
|
|
920
|
+
is_deployed = getattr(agent, "is_deployed", False)
|
|
921
|
+
status = "✓ Deployed" if is_deployed else "Available"
|
|
922
|
+
|
|
923
|
+
# Get display name (for remote agents, use display_name instead of agent_id)
|
|
924
|
+
display_name = getattr(agent, "display_name", agent.name)
|
|
925
|
+
if len(display_name) > 23:
|
|
926
|
+
display_name = display_name[:20] + "..."
|
|
927
|
+
|
|
928
|
+
agents_table.add_row(
|
|
929
|
+
str(idx), agent.name, display_name, source_label, status
|
|
930
|
+
)
|
|
931
|
+
|
|
932
|
+
self.console.print(agents_table)
|
|
933
|
+
self.console.print(f"\n[dim]Total: {len(agents)} agents available[/dim]")
|
|
934
|
+
|
|
935
|
+
def _manage_sources(self) -> None:
|
|
936
|
+
"""Interactive source management."""
|
|
937
|
+
self.console.print("\n[bold cyan]═══ Manage Agent Sources ═══[/bold cyan]\n")
|
|
938
|
+
self.console.print(
|
|
939
|
+
"[dim]Use 'claude-mpm agent-source' command to add/remove sources[/dim]"
|
|
940
|
+
)
|
|
941
|
+
self.console.print("\nExamples:")
|
|
942
|
+
self.console.print(" claude-mpm agent-source add <git-url>")
|
|
943
|
+
self.console.print(" claude-mpm agent-source remove <identifier>")
|
|
944
|
+
self.console.print(" claude-mpm agent-source list")
|
|
945
|
+
Prompt.ask("\nPress Enter to continue")
|
|
946
|
+
|
|
947
|
+
def _deploy_agents_individual(self, agents: List[AgentConfig]) -> None:
|
|
948
|
+
"""Deploy agents individually with selection interface."""
|
|
949
|
+
if not agents:
|
|
950
|
+
self.console.print("[yellow]No agents available for deployment[/yellow]")
|
|
951
|
+
Prompt.ask("\nPress Enter to continue")
|
|
952
|
+
return
|
|
953
|
+
|
|
954
|
+
# Filter to non-deployed agents
|
|
955
|
+
deployable = [a for a in agents if not getattr(a, "is_deployed", False)]
|
|
956
|
+
|
|
957
|
+
if not deployable:
|
|
958
|
+
self.console.print("[yellow]All agents are already deployed[/yellow]")
|
|
959
|
+
Prompt.ask("\nPress Enter to continue")
|
|
960
|
+
return
|
|
961
|
+
|
|
962
|
+
self.console.print(f"\n[bold]Deployable agents ({len(deployable)}):[/bold]")
|
|
963
|
+
for idx, agent in enumerate(deployable, 1):
|
|
964
|
+
display_name = getattr(agent, "display_name", agent.name)
|
|
965
|
+
self.console.print(f" {idx}. {agent.name} - {display_name}")
|
|
966
|
+
|
|
967
|
+
selection = Prompt.ask("\nEnter agent number to deploy (or 'c' to cancel)")
|
|
968
|
+
if selection.lower() == "c":
|
|
969
|
+
return
|
|
970
|
+
|
|
971
|
+
try:
|
|
972
|
+
idx = int(selection) - 1
|
|
973
|
+
if 0 <= idx < len(deployable):
|
|
974
|
+
agent = deployable[idx]
|
|
975
|
+
self._deploy_single_agent(agent)
|
|
976
|
+
else:
|
|
977
|
+
self.console.print("[red]Invalid selection[/red]")
|
|
978
|
+
Prompt.ask("\nPress Enter to continue")
|
|
979
|
+
except (ValueError, IndexError):
|
|
980
|
+
self.console.print("[red]Invalid selection[/red]")
|
|
981
|
+
Prompt.ask("\nPress Enter to continue")
|
|
982
|
+
|
|
983
|
+
def _deploy_agents_preset(self) -> None:
|
|
984
|
+
"""Deploy agents using preset configuration."""
|
|
985
|
+
try:
|
|
986
|
+
from claude_mpm.services.agents.agent_preset_service import (
|
|
987
|
+
AgentPresetService,
|
|
988
|
+
)
|
|
989
|
+
from claude_mpm.services.agents.git_source_manager import GitSourceManager
|
|
990
|
+
|
|
991
|
+
source_manager = GitSourceManager()
|
|
992
|
+
preset_service = AgentPresetService(source_manager)
|
|
993
|
+
|
|
994
|
+
presets = preset_service.list_presets()
|
|
995
|
+
|
|
996
|
+
if not presets:
|
|
997
|
+
self.console.print("[yellow]No presets available[/yellow]")
|
|
998
|
+
Prompt.ask("\nPress Enter to continue")
|
|
999
|
+
return
|
|
1000
|
+
|
|
1001
|
+
self.console.print("\n[bold cyan]═══ Available Presets ═══[/bold cyan]\n")
|
|
1002
|
+
for idx, preset in enumerate(presets, 1):
|
|
1003
|
+
self.console.print(f" {idx}. [cyan]{preset['name']}[/cyan]")
|
|
1004
|
+
self.console.print(f" {preset['description']}")
|
|
1005
|
+
self.console.print(f" [dim]Agents: {len(preset['agents'])}[/dim]\n")
|
|
1006
|
+
|
|
1007
|
+
selection = Prompt.ask("\nEnter preset number (or 'c' to cancel)")
|
|
1008
|
+
if selection.lower() == "c":
|
|
1009
|
+
return
|
|
1010
|
+
|
|
1011
|
+
idx = int(selection) - 1
|
|
1012
|
+
if 0 <= idx < len(presets):
|
|
1013
|
+
preset_name = presets[idx]["name"]
|
|
1014
|
+
|
|
1015
|
+
# Resolve and deploy preset
|
|
1016
|
+
resolution = preset_service.resolve_agents(preset_name)
|
|
1017
|
+
|
|
1018
|
+
if resolution.get("missing_agents"):
|
|
1019
|
+
self.console.print(
|
|
1020
|
+
f"[red]Missing agents: {len(resolution['missing_agents'])}[/red]"
|
|
1021
|
+
)
|
|
1022
|
+
for agent_id in resolution["missing_agents"]:
|
|
1023
|
+
self.console.print(f" • {agent_id}")
|
|
1024
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1025
|
+
return
|
|
1026
|
+
|
|
1027
|
+
# Confirm deployment
|
|
1028
|
+
self.console.print(
|
|
1029
|
+
f"\n[bold]Preset '{preset_name}' includes {len(resolution['agents'])} agents[/bold]"
|
|
1030
|
+
)
|
|
1031
|
+
if Confirm.ask("Deploy all agents?", default=True):
|
|
1032
|
+
deployed = 0
|
|
1033
|
+
for agent in resolution["agents"]:
|
|
1034
|
+
# Convert dict to AgentConfig-like object for deployment
|
|
1035
|
+
agent_config = AgentConfig(
|
|
1036
|
+
name=agent.get("agent_id", "unknown"),
|
|
1037
|
+
description=agent.get("metadata", {}).get(
|
|
1038
|
+
"description", ""
|
|
1039
|
+
),
|
|
1040
|
+
dependencies=[],
|
|
1041
|
+
)
|
|
1042
|
+
agent_config.source_dict = agent
|
|
1043
|
+
agent_config.full_agent_id = agent.get("agent_id", "unknown")
|
|
1044
|
+
|
|
1045
|
+
if self._deploy_single_agent(agent_config, show_feedback=False):
|
|
1046
|
+
deployed += 1
|
|
1047
|
+
|
|
1048
|
+
self.console.print(
|
|
1049
|
+
f"\n[green]✓ Deployed {deployed}/{len(resolution['agents'])} agents[/green]"
|
|
1050
|
+
)
|
|
1051
|
+
|
|
1052
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1053
|
+
else:
|
|
1054
|
+
self.console.print("[red]Invalid selection[/red]")
|
|
1055
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1056
|
+
|
|
1057
|
+
except Exception as e:
|
|
1058
|
+
self.console.print(f"[red]Error deploying preset: {e}[/red]")
|
|
1059
|
+
self.logger.error(f"Preset deployment failed: {e}", exc_info=True)
|
|
1060
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1061
|
+
|
|
1062
|
+
def _deploy_single_agent(
|
|
1063
|
+
self, agent: AgentConfig, show_feedback: bool = True
|
|
1064
|
+
) -> bool:
|
|
1065
|
+
"""Deploy a single agent to the appropriate location."""
|
|
1066
|
+
try:
|
|
1067
|
+
# Check if this is a remote agent with source_dict
|
|
1068
|
+
source_dict = getattr(agent, "source_dict", None)
|
|
1069
|
+
full_agent_id = getattr(agent, "full_agent_id", agent.name)
|
|
1070
|
+
|
|
1071
|
+
if source_dict:
|
|
1072
|
+
# Deploy remote agent using its source file
|
|
1073
|
+
source_file = Path(source_dict.get("source_file", ""))
|
|
1074
|
+
if not source_file.exists():
|
|
1075
|
+
if show_feedback:
|
|
1076
|
+
self.console.print(
|
|
1077
|
+
f"[red]✗ Source file not found: {source_file}[/red]"
|
|
1078
|
+
)
|
|
1079
|
+
return False
|
|
1080
|
+
|
|
1081
|
+
# Determine target file name (use leaf name from hierarchical ID)
|
|
1082
|
+
if "/" in full_agent_id:
|
|
1083
|
+
target_name = full_agent_id.split("/")[-1] + ".md"
|
|
1084
|
+
else:
|
|
1085
|
+
target_name = full_agent_id + ".md"
|
|
1086
|
+
|
|
1087
|
+
# Deploy to user-level agents directory
|
|
1088
|
+
target_dir = Path.home() / ".claude" / "agents"
|
|
1089
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
1090
|
+
target_file = target_dir / target_name
|
|
1091
|
+
|
|
1092
|
+
if show_feedback:
|
|
1093
|
+
self.console.print(f"\n[cyan]Deploying {full_agent_id}...[/cyan]")
|
|
1094
|
+
|
|
1095
|
+
# Copy the agent file
|
|
1096
|
+
import shutil
|
|
1097
|
+
|
|
1098
|
+
shutil.copy2(source_file, target_file)
|
|
1099
|
+
|
|
1100
|
+
if show_feedback:
|
|
1101
|
+
self.console.print(
|
|
1102
|
+
f"[green]✓ Successfully deployed {full_agent_id} to {target_file}[/green]"
|
|
1103
|
+
)
|
|
1104
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1105
|
+
|
|
1106
|
+
return True
|
|
1107
|
+
# Legacy local template deployment (not implemented here)
|
|
1108
|
+
if show_feedback:
|
|
1109
|
+
self.console.print(
|
|
1110
|
+
"[yellow]Local template deployment not yet implemented[/yellow]"
|
|
1111
|
+
)
|
|
1112
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1113
|
+
return False
|
|
1114
|
+
|
|
1115
|
+
except Exception as e:
|
|
1116
|
+
if show_feedback:
|
|
1117
|
+
self.console.print(f"[red]Error deploying agent: {e}[/red]")
|
|
1118
|
+
self.logger.error(f"Agent deployment failed: {e}", exc_info=True)
|
|
1119
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1120
|
+
return False
|
|
1121
|
+
|
|
1122
|
+
def _remove_agents(self, agents: List[AgentConfig]) -> None:
|
|
1123
|
+
"""Remove deployed agents."""
|
|
1124
|
+
# Filter to deployed agents only
|
|
1125
|
+
deployed = [a for a in agents if getattr(a, "is_deployed", False)]
|
|
1126
|
+
|
|
1127
|
+
if not deployed:
|
|
1128
|
+
self.console.print("[yellow]No agents are currently deployed[/yellow]")
|
|
1129
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1130
|
+
return
|
|
1131
|
+
|
|
1132
|
+
self.console.print(f"\n[bold]Deployed agents ({len(deployed)}):[/bold]")
|
|
1133
|
+
for idx, agent in enumerate(deployed, 1):
|
|
1134
|
+
display_name = getattr(agent, "display_name", agent.name)
|
|
1135
|
+
self.console.print(f" {idx}. {agent.name} - {display_name}")
|
|
1136
|
+
|
|
1137
|
+
selection = Prompt.ask("\nEnter agent number to remove (or 'c' to cancel)")
|
|
1138
|
+
if selection.lower() == "c":
|
|
1139
|
+
return
|
|
1140
|
+
|
|
1141
|
+
try:
|
|
1142
|
+
idx = int(selection) - 1
|
|
1143
|
+
if 0 <= idx < len(deployed):
|
|
1144
|
+
agent = deployed[idx]
|
|
1145
|
+
full_agent_id = getattr(agent, "full_agent_id", agent.name)
|
|
1146
|
+
|
|
1147
|
+
# Determine possible file names (hierarchical and leaf)
|
|
1148
|
+
file_names = [f"{full_agent_id}.md"]
|
|
1149
|
+
if "/" in full_agent_id:
|
|
1150
|
+
leaf_name = full_agent_id.split("/")[-1]
|
|
1151
|
+
file_names.append(f"{leaf_name}.md")
|
|
1152
|
+
|
|
1153
|
+
# Remove from both project and user directories
|
|
1154
|
+
removed = False
|
|
1155
|
+
project_agent_dir = Path.cwd() / ".claude-mpm" / "agents"
|
|
1156
|
+
user_agent_dir = Path.home() / ".claude" / "agents"
|
|
1157
|
+
|
|
1158
|
+
for file_name in file_names:
|
|
1159
|
+
project_file = project_agent_dir / file_name
|
|
1160
|
+
user_file = user_agent_dir / file_name
|
|
1161
|
+
|
|
1162
|
+
if project_file.exists():
|
|
1163
|
+
project_file.unlink()
|
|
1164
|
+
removed = True
|
|
1165
|
+
self.console.print(f"[green]✓ Removed {project_file}[/green]")
|
|
1166
|
+
|
|
1167
|
+
if user_file.exists():
|
|
1168
|
+
user_file.unlink()
|
|
1169
|
+
removed = True
|
|
1170
|
+
self.console.print(f"[green]✓ Removed {user_file}[/green]")
|
|
1171
|
+
|
|
1172
|
+
if removed:
|
|
1173
|
+
self.console.print(
|
|
1174
|
+
f"[green]✓ Successfully removed {full_agent_id}[/green]"
|
|
1175
|
+
)
|
|
1176
|
+
else:
|
|
1177
|
+
self.console.print("[yellow]Agent files not found[/yellow]")
|
|
1178
|
+
|
|
1179
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1180
|
+
else:
|
|
1181
|
+
self.console.print("[red]Invalid selection[/red]")
|
|
1182
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1183
|
+
|
|
1184
|
+
except (ValueError, IndexError):
|
|
1185
|
+
self.console.print("[red]Invalid selection[/red]")
|
|
1186
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1187
|
+
|
|
1188
|
+
def _view_agent_details_enhanced(self, agents: List[AgentConfig]) -> None:
|
|
1189
|
+
"""View detailed agent information with enhanced remote agent details."""
|
|
1190
|
+
if not agents:
|
|
1191
|
+
self.console.print("[yellow]No agents available[/yellow]")
|
|
1192
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1193
|
+
return
|
|
1194
|
+
|
|
1195
|
+
self.console.print(f"\n[bold]Available agents ({len(agents)}):[/bold]")
|
|
1196
|
+
for idx, agent in enumerate(agents, 1):
|
|
1197
|
+
display_name = getattr(agent, "display_name", agent.name)
|
|
1198
|
+
self.console.print(f" {idx}. {agent.name} - {display_name}")
|
|
1199
|
+
|
|
1200
|
+
selection = Prompt.ask("\nEnter agent number to view (or 'c' to cancel)")
|
|
1201
|
+
if selection.lower() == "c":
|
|
1202
|
+
return
|
|
1203
|
+
|
|
1204
|
+
try:
|
|
1205
|
+
idx = int(selection) - 1
|
|
1206
|
+
if 0 <= idx < len(agents):
|
|
1207
|
+
agent = agents[idx]
|
|
1208
|
+
|
|
1209
|
+
self.console.clear()
|
|
1210
|
+
self.console.print("\n[bold cyan]═══ Agent Details ═══[/bold cyan]\n")
|
|
1211
|
+
|
|
1212
|
+
# Basic info
|
|
1213
|
+
self.console.print(f"[bold]ID:[/bold] {agent.name}")
|
|
1214
|
+
display_name = getattr(agent, "display_name", "N/A")
|
|
1215
|
+
self.console.print(f"[bold]Name:[/bold] {display_name}")
|
|
1216
|
+
self.console.print(f"[bold]Description:[/bold] {agent.description}")
|
|
1217
|
+
|
|
1218
|
+
# Source info
|
|
1219
|
+
source_type = getattr(agent, "source_type", "local")
|
|
1220
|
+
self.console.print(f"[bold]Source Type:[/bold] {source_type}")
|
|
1221
|
+
|
|
1222
|
+
if source_type == "remote":
|
|
1223
|
+
source_dict = getattr(agent, "source_dict", {})
|
|
1224
|
+
category = source_dict.get("category", "N/A")
|
|
1225
|
+
source = source_dict.get("source", "N/A")
|
|
1226
|
+
version = source_dict.get("version", "N/A")
|
|
1227
|
+
|
|
1228
|
+
self.console.print(f"[bold]Category:[/bold] {category}")
|
|
1229
|
+
self.console.print(f"[bold]Source:[/bold] {source}")
|
|
1230
|
+
self.console.print(f"[bold]Version:[/bold] {version[:16]}...")
|
|
1231
|
+
|
|
1232
|
+
# Deployment status
|
|
1233
|
+
is_deployed = getattr(agent, "is_deployed", False)
|
|
1234
|
+
status = "✓ Deployed" if is_deployed else "Available"
|
|
1235
|
+
self.console.print(f"[bold]Status:[/bold] {status}")
|
|
1236
|
+
|
|
1237
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1238
|
+
else:
|
|
1239
|
+
self.console.print("[red]Invalid selection[/red]")
|
|
1240
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1241
|
+
|
|
1242
|
+
except (ValueError, IndexError):
|
|
1243
|
+
self.console.print("[red]Invalid selection[/red]")
|
|
1244
|
+
Prompt.ask("\nPress Enter to continue")
|
|
1245
|
+
|
|
812
1246
|
|
|
813
1247
|
def manage_configure(args) -> int:
|
|
814
1248
|
"""Main entry point for configuration management command.
|
|
@@ -228,8 +228,8 @@ class AgentDisplay:
|
|
|
228
228
|
[bold]Model:[/bold] {model}
|
|
229
229
|
[bold]Agent Version:[/bold] {agent_version}
|
|
230
230
|
[bold]Schema Version:[/bold] {schema_version}
|
|
231
|
-
[bold]Tags:[/bold] {
|
|
232
|
-
[bold]Tools:[/bold] {
|
|
231
|
+
[bold]Tags:[/bold] {", ".join(tags) if tags else "None"}
|
|
232
|
+
[bold]Tools:[/bold] {", ".join(tools[:5]) if tools else "None"}{"..." if len(tools) > 5 else ""}
|
|
233
233
|
"""
|
|
234
234
|
except Exception:
|
|
235
235
|
pass
|
|
@@ -237,9 +237,9 @@ class AgentDisplay:
|
|
|
237
237
|
# Create detail panel
|
|
238
238
|
detail_text = f"""
|
|
239
239
|
[bold]Name:[/bold] {agent.name}
|
|
240
|
-
[bold]Status:[/bold] {
|
|
240
|
+
[bold]Status:[/bold] {"[green]Enabled[/green]" if self.agent_manager.is_agent_enabled(agent.name) else "[red]Disabled[/red]"}
|
|
241
241
|
[bold]Template Path:[/bold] {template_path}
|
|
242
|
-
[bold]Is System Template:[/bold] {
|
|
242
|
+
[bold]Is System Template:[/bold] {"Yes" if str(template_path).startswith(str(self.agent_manager.templates_dir)) else "No (Custom)"}
|
|
243
243
|
{extra_info}
|
|
244
244
|
"""
|
|
245
245
|
|