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
|
@@ -3,13 +3,18 @@ Skills command implementation for claude-mpm.
|
|
|
3
3
|
|
|
4
4
|
WHY: This module provides CLI commands for managing Claude Code skills,
|
|
5
5
|
exposing SkillsService functionality for skill discovery, deployment, validation,
|
|
6
|
-
updates, and configuration.
|
|
6
|
+
updates, and configuration. Also provides GitHub skills deployment via SkillsDeployer.
|
|
7
7
|
|
|
8
8
|
DESIGN DECISIONS:
|
|
9
9
|
- Use BaseCommand pattern for consistency with other CLI commands
|
|
10
10
|
- Rich output formatting for user-friendly display
|
|
11
11
|
- Graceful error handling with informative messages
|
|
12
12
|
- Support for verbose output and structured formats
|
|
13
|
+
- Dual service approach: SkillsService for bundled, SkillsDeployer for GitHub
|
|
14
|
+
|
|
15
|
+
ARCHITECTURE:
|
|
16
|
+
- SkillsService: Manages bundled skills (in project .claude/skills/)
|
|
17
|
+
- SkillsDeployer: Downloads from GitHub to ~/.claude/skills/ for Claude Code
|
|
13
18
|
"""
|
|
14
19
|
|
|
15
20
|
import os
|
|
@@ -19,8 +24,10 @@ from typing import Optional
|
|
|
19
24
|
from rich.console import Console
|
|
20
25
|
from rich.markdown import Markdown
|
|
21
26
|
from rich.panel import Panel
|
|
27
|
+
from rich.table import Table
|
|
22
28
|
|
|
23
29
|
from ...constants import SkillsCommands
|
|
30
|
+
from ...services.skills_deployer import SkillsDeployerService
|
|
24
31
|
from ...skills.skills_service import SkillsService
|
|
25
32
|
from ..shared import BaseCommand, CommandResult
|
|
26
33
|
|
|
@@ -33,6 +40,7 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
33
40
|
def __init__(self):
|
|
34
41
|
super().__init__("skills")
|
|
35
42
|
self._skills_service = None
|
|
43
|
+
self._skills_deployer = None
|
|
36
44
|
|
|
37
45
|
@property
|
|
38
46
|
def skills_service(self) -> SkillsService:
|
|
@@ -41,6 +49,13 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
41
49
|
self._skills_service = SkillsService()
|
|
42
50
|
return self._skills_service
|
|
43
51
|
|
|
52
|
+
@property
|
|
53
|
+
def skills_deployer(self) -> SkillsDeployerService:
|
|
54
|
+
"""Get skills deployer instance (lazy loaded)."""
|
|
55
|
+
if self._skills_deployer is None:
|
|
56
|
+
self._skills_deployer = SkillsDeployerService()
|
|
57
|
+
return self._skills_deployer
|
|
58
|
+
|
|
44
59
|
def validate_args(self, args) -> Optional[str]:
|
|
45
60
|
"""Validate command arguments."""
|
|
46
61
|
# Most skills commands are optional, basic validation
|
|
@@ -68,6 +83,18 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
68
83
|
SkillsCommands.UPDATE.value: self._update_skills,
|
|
69
84
|
SkillsCommands.INFO.value: self._show_skill_info,
|
|
70
85
|
SkillsCommands.CONFIG.value: self._manage_config,
|
|
86
|
+
# GitHub deployment commands
|
|
87
|
+
SkillsCommands.DEPLOY_FROM_GITHUB.value: self._deploy_from_github,
|
|
88
|
+
SkillsCommands.LIST_AVAILABLE.value: self._list_available_github_skills,
|
|
89
|
+
SkillsCommands.CHECK_DEPLOYED.value: self._check_deployed_skills,
|
|
90
|
+
SkillsCommands.REMOVE.value: self._remove_skills,
|
|
91
|
+
# Collection management commands
|
|
92
|
+
SkillsCommands.COLLECTION_LIST.value: self._collection_list,
|
|
93
|
+
SkillsCommands.COLLECTION_ADD.value: self._collection_add,
|
|
94
|
+
SkillsCommands.COLLECTION_REMOVE.value: self._collection_remove,
|
|
95
|
+
SkillsCommands.COLLECTION_ENABLE.value: self._collection_enable,
|
|
96
|
+
SkillsCommands.COLLECTION_DISABLE.value: self._collection_disable,
|
|
97
|
+
SkillsCommands.COLLECTION_SET_DEFAULT.value: self._collection_set_default,
|
|
71
98
|
}
|
|
72
99
|
|
|
73
100
|
handler = command_map.get(args.skills_command)
|
|
@@ -448,6 +475,209 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
448
475
|
console.print(f"[red]Error managing configuration: {e}[/red]")
|
|
449
476
|
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
450
477
|
|
|
478
|
+
def _deploy_from_github(self, args) -> CommandResult:
|
|
479
|
+
"""Deploy skills from GitHub repository."""
|
|
480
|
+
try:
|
|
481
|
+
collection = getattr(args, "collection", None)
|
|
482
|
+
toolchain = getattr(args, "toolchain", None)
|
|
483
|
+
categories = getattr(args, "categories", None)
|
|
484
|
+
force = getattr(args, "force", False)
|
|
485
|
+
all_skills = getattr(args, "all", False)
|
|
486
|
+
|
|
487
|
+
if collection:
|
|
488
|
+
console.print(
|
|
489
|
+
f"\n[bold cyan]Deploying skills from collection '{collection}'...[/bold cyan]\n"
|
|
490
|
+
)
|
|
491
|
+
else:
|
|
492
|
+
console.print(
|
|
493
|
+
"\n[bold cyan]Deploying skills from default collection...[/bold cyan]\n"
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
# Auto-detect toolchain if not specified and not deploying all
|
|
497
|
+
if not toolchain and not all_skills:
|
|
498
|
+
console.print(
|
|
499
|
+
"[yellow]No toolchain specified. Use --toolchain to filter by language,[/yellow]"
|
|
500
|
+
)
|
|
501
|
+
console.print(
|
|
502
|
+
"[yellow]or --all to deploy all available skills.[/yellow]\n"
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
result = self.skills_deployer.deploy_skills(
|
|
506
|
+
collection=collection,
|
|
507
|
+
toolchain=toolchain,
|
|
508
|
+
categories=categories,
|
|
509
|
+
force=force,
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
# Display results
|
|
513
|
+
if result["deployed_count"] > 0:
|
|
514
|
+
console.print(
|
|
515
|
+
f"[green]✓ Deployed {result['deployed_count']} skill(s):[/green]"
|
|
516
|
+
)
|
|
517
|
+
for skill in result["deployed_skills"]:
|
|
518
|
+
console.print(f" • {skill}")
|
|
519
|
+
console.print()
|
|
520
|
+
|
|
521
|
+
if result["skipped_count"] > 0:
|
|
522
|
+
console.print(
|
|
523
|
+
f"[yellow]⊘ Skipped {result['skipped_count']} skill(s) (already deployed):[/yellow]"
|
|
524
|
+
)
|
|
525
|
+
for skill in result["skipped_skills"]:
|
|
526
|
+
console.print(f" • {skill}")
|
|
527
|
+
console.print("[dim]Use --force to redeploy[/dim]\n")
|
|
528
|
+
|
|
529
|
+
if result["errors"]:
|
|
530
|
+
console.print(f"[red]✗ {len(result['errors'])} error(s):[/red]")
|
|
531
|
+
for error in result["errors"]:
|
|
532
|
+
console.print(f" • {error}")
|
|
533
|
+
console.print()
|
|
534
|
+
|
|
535
|
+
# Show restart instructions
|
|
536
|
+
if result["restart_instructions"]:
|
|
537
|
+
console.print(
|
|
538
|
+
Panel(
|
|
539
|
+
result["restart_instructions"],
|
|
540
|
+
title="⚠️ Important",
|
|
541
|
+
border_style="yellow",
|
|
542
|
+
)
|
|
543
|
+
)
|
|
544
|
+
console.print()
|
|
545
|
+
|
|
546
|
+
exit_code = 1 if result["errors"] else 0
|
|
547
|
+
return CommandResult(success=not result["errors"], exit_code=exit_code)
|
|
548
|
+
|
|
549
|
+
except Exception as e:
|
|
550
|
+
console.print(f"[red]Error deploying from GitHub: {e}[/red]")
|
|
551
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
552
|
+
|
|
553
|
+
def _list_available_github_skills(self, args) -> CommandResult:
|
|
554
|
+
"""List available skills from GitHub repository."""
|
|
555
|
+
try:
|
|
556
|
+
collection = getattr(args, "collection", None)
|
|
557
|
+
|
|
558
|
+
if collection:
|
|
559
|
+
console.print(
|
|
560
|
+
f"\n[bold cyan]Fetching skills from collection '{collection}'...[/bold cyan]\n"
|
|
561
|
+
)
|
|
562
|
+
else:
|
|
563
|
+
console.print(
|
|
564
|
+
"\n[bold cyan]Fetching skills from default collection...[/bold cyan]\n"
|
|
565
|
+
)
|
|
566
|
+
|
|
567
|
+
result = self.skills_deployer.list_available_skills(collection=collection)
|
|
568
|
+
|
|
569
|
+
if result.get("error"):
|
|
570
|
+
console.print(f"[red]Error: {result['error']}[/red]")
|
|
571
|
+
return CommandResult(
|
|
572
|
+
success=False, message=result["error"], exit_code=1
|
|
573
|
+
)
|
|
574
|
+
|
|
575
|
+
console.print(
|
|
576
|
+
f"[green]Found {result['total_skills']} available skills[/green]\n"
|
|
577
|
+
)
|
|
578
|
+
|
|
579
|
+
# Display by category
|
|
580
|
+
console.print("[bold yellow]By Category:[/bold yellow]\n")
|
|
581
|
+
for category, skills in sorted(result["by_category"].items()):
|
|
582
|
+
console.print(f" [cyan]{category}[/cyan] ({len(skills)} skills)")
|
|
583
|
+
if hasattr(args, "verbose") and args.verbose:
|
|
584
|
+
for skill in sorted(skills, key=lambda s: s.get("name", "")):
|
|
585
|
+
console.print(f" • {skill.get('name', 'unknown')}")
|
|
586
|
+
console.print()
|
|
587
|
+
|
|
588
|
+
# Display by toolchain
|
|
589
|
+
console.print("[bold yellow]By Toolchain:[/bold yellow]\n")
|
|
590
|
+
for toolchain, skills in sorted(result["by_toolchain"].items()):
|
|
591
|
+
console.print(f" [cyan]{toolchain}[/cyan] ({len(skills)} skills)")
|
|
592
|
+
if hasattr(args, "verbose") and args.verbose:
|
|
593
|
+
for skill in sorted(skills, key=lambda s: s.get("name", "")):
|
|
594
|
+
console.print(f" • {skill.get('name', 'unknown')}")
|
|
595
|
+
console.print()
|
|
596
|
+
|
|
597
|
+
return CommandResult(success=True, exit_code=0)
|
|
598
|
+
|
|
599
|
+
except Exception as e:
|
|
600
|
+
console.print(f"[red]Error listing available skills: {e}[/red]")
|
|
601
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
602
|
+
|
|
603
|
+
def _check_deployed_skills(self, args) -> CommandResult:
|
|
604
|
+
"""Check currently deployed skills in ~/.claude/skills/."""
|
|
605
|
+
try:
|
|
606
|
+
result = self.skills_deployer.check_deployed_skills()
|
|
607
|
+
|
|
608
|
+
console.print("\n[bold cyan]Claude Code Skills Status:[/bold cyan]\n")
|
|
609
|
+
console.print(f"[dim]Directory: {result['claude_skills_dir']}[/dim]\n")
|
|
610
|
+
|
|
611
|
+
if result["deployed_count"] == 0:
|
|
612
|
+
console.print("[yellow]No skills currently deployed.[/yellow]")
|
|
613
|
+
console.print(
|
|
614
|
+
"[dim]Use 'claude-mpm skills deploy-github' to deploy skills.[/dim]\n"
|
|
615
|
+
)
|
|
616
|
+
return CommandResult(success=True, exit_code=0)
|
|
617
|
+
|
|
618
|
+
console.print(
|
|
619
|
+
f"[green]{result['deployed_count']} skill(s) deployed:[/green]\n"
|
|
620
|
+
)
|
|
621
|
+
|
|
622
|
+
# Create table for deployed skills
|
|
623
|
+
table = Table(show_header=True, header_style="bold cyan")
|
|
624
|
+
table.add_column("Skill Name", style="green")
|
|
625
|
+
table.add_column("Path", style="dim")
|
|
626
|
+
|
|
627
|
+
for skill in sorted(result["skills"], key=lambda s: s["name"]):
|
|
628
|
+
table.add_row(skill["name"], skill["path"])
|
|
629
|
+
|
|
630
|
+
console.print(table)
|
|
631
|
+
console.print()
|
|
632
|
+
|
|
633
|
+
return CommandResult(success=True, exit_code=0)
|
|
634
|
+
|
|
635
|
+
except Exception as e:
|
|
636
|
+
console.print(f"[red]Error checking deployed skills: {e}[/red]")
|
|
637
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
638
|
+
|
|
639
|
+
def _remove_skills(self, args) -> CommandResult:
|
|
640
|
+
"""Remove deployed skills."""
|
|
641
|
+
try:
|
|
642
|
+
skill_names = getattr(args, "skill_names", None)
|
|
643
|
+
remove_all = getattr(args, "all", False)
|
|
644
|
+
|
|
645
|
+
if remove_all:
|
|
646
|
+
skill_names = None
|
|
647
|
+
console.print(
|
|
648
|
+
"\n[bold yellow]Removing ALL deployed skills...[/bold yellow]\n"
|
|
649
|
+
)
|
|
650
|
+
elif skill_names:
|
|
651
|
+
console.print(
|
|
652
|
+
f"\n[bold cyan]Removing {len(skill_names)} skill(s)...[/bold cyan]\n"
|
|
653
|
+
)
|
|
654
|
+
else:
|
|
655
|
+
console.print("[red]Error: Specify skill names or use --all[/red]")
|
|
656
|
+
return CommandResult(success=False, exit_code=1)
|
|
657
|
+
|
|
658
|
+
result = self.skills_deployer.remove_skills(skill_names)
|
|
659
|
+
|
|
660
|
+
if result["removed_count"] > 0:
|
|
661
|
+
console.print(
|
|
662
|
+
f"[green]✓ Removed {result['removed_count']} skill(s):[/green]"
|
|
663
|
+
)
|
|
664
|
+
for skill in result["removed_skills"]:
|
|
665
|
+
console.print(f" • {skill}")
|
|
666
|
+
console.print()
|
|
667
|
+
|
|
668
|
+
if result["errors"]:
|
|
669
|
+
console.print(f"[red]✗ {len(result['errors'])} error(s):[/red]")
|
|
670
|
+
for error in result["errors"]:
|
|
671
|
+
console.print(f" • {error}")
|
|
672
|
+
console.print()
|
|
673
|
+
|
|
674
|
+
exit_code = 1 if result["errors"] else 0
|
|
675
|
+
return CommandResult(success=not result["errors"], exit_code=exit_code)
|
|
676
|
+
|
|
677
|
+
except Exception as e:
|
|
678
|
+
console.print(f"[red]Error removing skills: {e}[/red]")
|
|
679
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
680
|
+
|
|
451
681
|
def _get_skill_metadata(self, skill_name: str) -> Optional[dict]:
|
|
452
682
|
"""Get skill metadata from SKILL.md file."""
|
|
453
683
|
try:
|
|
@@ -464,6 +694,210 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
464
694
|
except Exception:
|
|
465
695
|
return None
|
|
466
696
|
|
|
697
|
+
# === Collection Management Commands ===
|
|
698
|
+
|
|
699
|
+
def _collection_list(self, args) -> CommandResult:
|
|
700
|
+
"""List all configured skill collections."""
|
|
701
|
+
try:
|
|
702
|
+
result = self.skills_deployer.list_collections()
|
|
703
|
+
|
|
704
|
+
console.print("\n[bold cyan]Skill Collections:[/bold cyan]\n")
|
|
705
|
+
console.print(
|
|
706
|
+
f"[dim]Default collection: {result['default_collection']}[/dim]"
|
|
707
|
+
)
|
|
708
|
+
console.print(
|
|
709
|
+
f"[dim]Enabled: {result['enabled_count']} / {result['total_count']}[/dim]\n"
|
|
710
|
+
)
|
|
711
|
+
|
|
712
|
+
if not result["collections"]:
|
|
713
|
+
console.print("[yellow]No collections configured.[/yellow]")
|
|
714
|
+
console.print(
|
|
715
|
+
"[dim]Use 'claude-mpm skills collection-add' to add a collection.[/dim]\n"
|
|
716
|
+
)
|
|
717
|
+
return CommandResult(success=True, exit_code=0)
|
|
718
|
+
|
|
719
|
+
# Create table for collections
|
|
720
|
+
table = Table(show_header=True, header_style="bold cyan")
|
|
721
|
+
table.add_column("Name", style="green")
|
|
722
|
+
table.add_column("URL", style="white")
|
|
723
|
+
table.add_column("Priority", justify="center")
|
|
724
|
+
table.add_column("Enabled", justify="center")
|
|
725
|
+
table.add_column("Last Update", style="dim")
|
|
726
|
+
table.add_column("Default", justify="center")
|
|
727
|
+
|
|
728
|
+
# Sort by priority
|
|
729
|
+
sorted_collections = sorted(
|
|
730
|
+
result["collections"].items(), key=lambda x: x[1].get("priority", 999)
|
|
731
|
+
)
|
|
732
|
+
|
|
733
|
+
for name, config in sorted_collections:
|
|
734
|
+
enabled_icon = "✓" if config.get("enabled", True) else "✗"
|
|
735
|
+
default_icon = "⭐" if name == result["default_collection"] else ""
|
|
736
|
+
last_update = config.get("last_update") or "Never"
|
|
737
|
+
|
|
738
|
+
table.add_row(
|
|
739
|
+
name,
|
|
740
|
+
config["url"],
|
|
741
|
+
str(config.get("priority", "N/A")),
|
|
742
|
+
enabled_icon,
|
|
743
|
+
last_update,
|
|
744
|
+
default_icon,
|
|
745
|
+
)
|
|
746
|
+
|
|
747
|
+
console.print(table)
|
|
748
|
+
console.print()
|
|
749
|
+
|
|
750
|
+
return CommandResult(success=True, exit_code=0)
|
|
751
|
+
|
|
752
|
+
except Exception as e:
|
|
753
|
+
console.print(f"[red]Error listing collections: {e}[/red]")
|
|
754
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
755
|
+
|
|
756
|
+
def _collection_add(self, args) -> CommandResult:
|
|
757
|
+
"""Add a new skill collection."""
|
|
758
|
+
try:
|
|
759
|
+
name = getattr(args, "collection_name", None)
|
|
760
|
+
url = getattr(args, "collection_url", None)
|
|
761
|
+
priority = getattr(args, "priority", 99)
|
|
762
|
+
|
|
763
|
+
if not name or not url:
|
|
764
|
+
console.print("[red]Error: Collection name and URL are required[/red]")
|
|
765
|
+
console.print(
|
|
766
|
+
"[dim]Usage: claude-mpm skills collection-add NAME URL [--priority N][/dim]"
|
|
767
|
+
)
|
|
768
|
+
return CommandResult(success=False, exit_code=1)
|
|
769
|
+
|
|
770
|
+
console.print(f"\n[bold cyan]Adding collection '{name}'...[/bold cyan]\n")
|
|
771
|
+
|
|
772
|
+
result = self.skills_deployer.add_collection(name, url, priority)
|
|
773
|
+
|
|
774
|
+
console.print(f"[green]✓ {result['message']}[/green]")
|
|
775
|
+
console.print(f" [dim]URL: {url}[/dim]")
|
|
776
|
+
console.print(f" [dim]Priority: {priority}[/dim]\n")
|
|
777
|
+
|
|
778
|
+
return CommandResult(success=True, exit_code=0)
|
|
779
|
+
|
|
780
|
+
except ValueError as e:
|
|
781
|
+
console.print(f"[red]Error: {e}[/red]")
|
|
782
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
783
|
+
except Exception as e:
|
|
784
|
+
console.print(f"[red]Unexpected error: {e}[/red]")
|
|
785
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
786
|
+
|
|
787
|
+
def _collection_remove(self, args) -> CommandResult:
|
|
788
|
+
"""Remove a skill collection."""
|
|
789
|
+
try:
|
|
790
|
+
name = getattr(args, "collection_name", None)
|
|
791
|
+
|
|
792
|
+
if not name:
|
|
793
|
+
console.print("[red]Error: Collection name is required[/red]")
|
|
794
|
+
console.print(
|
|
795
|
+
"[dim]Usage: claude-mpm skills collection-remove NAME[/dim]"
|
|
796
|
+
)
|
|
797
|
+
return CommandResult(success=False, exit_code=1)
|
|
798
|
+
|
|
799
|
+
console.print(
|
|
800
|
+
f"\n[bold yellow]Removing collection '{name}'...[/bold yellow]\n"
|
|
801
|
+
)
|
|
802
|
+
|
|
803
|
+
result = self.skills_deployer.remove_collection(name)
|
|
804
|
+
|
|
805
|
+
console.print(f"[green]✓ {result['message']}[/green]")
|
|
806
|
+
if result.get("directory_removed"):
|
|
807
|
+
console.print(" [dim]Collection directory removed[/dim]")
|
|
808
|
+
elif result.get("directory_error"):
|
|
809
|
+
console.print(
|
|
810
|
+
f" [yellow]Warning: {result['directory_error']}[/yellow]"
|
|
811
|
+
)
|
|
812
|
+
console.print()
|
|
813
|
+
|
|
814
|
+
return CommandResult(success=True, exit_code=0)
|
|
815
|
+
|
|
816
|
+
except ValueError as e:
|
|
817
|
+
console.print(f"[red]Error: {e}[/red]")
|
|
818
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
819
|
+
except Exception as e:
|
|
820
|
+
console.print(f"[red]Unexpected error: {e}[/red]")
|
|
821
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
822
|
+
|
|
823
|
+
def _collection_enable(self, args) -> CommandResult:
|
|
824
|
+
"""Enable a disabled collection."""
|
|
825
|
+
try:
|
|
826
|
+
name = getattr(args, "collection_name", None)
|
|
827
|
+
|
|
828
|
+
if not name:
|
|
829
|
+
console.print("[red]Error: Collection name is required[/red]")
|
|
830
|
+
console.print(
|
|
831
|
+
"[dim]Usage: claude-mpm skills collection-enable NAME[/dim]"
|
|
832
|
+
)
|
|
833
|
+
return CommandResult(success=False, exit_code=1)
|
|
834
|
+
|
|
835
|
+
result = self.skills_deployer.enable_collection(name)
|
|
836
|
+
|
|
837
|
+
console.print(f"\n[green]✓ {result['message']}[/green]\n")
|
|
838
|
+
|
|
839
|
+
return CommandResult(success=True, exit_code=0)
|
|
840
|
+
|
|
841
|
+
except ValueError as e:
|
|
842
|
+
console.print(f"[red]Error: {e}[/red]")
|
|
843
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
844
|
+
except Exception as e:
|
|
845
|
+
console.print(f"[red]Unexpected error: {e}[/red]")
|
|
846
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
847
|
+
|
|
848
|
+
def _collection_disable(self, args) -> CommandResult:
|
|
849
|
+
"""Disable a collection."""
|
|
850
|
+
try:
|
|
851
|
+
name = getattr(args, "collection_name", None)
|
|
852
|
+
|
|
853
|
+
if not name:
|
|
854
|
+
console.print("[red]Error: Collection name is required[/red]")
|
|
855
|
+
console.print(
|
|
856
|
+
"[dim]Usage: claude-mpm skills collection-disable NAME[/dim]"
|
|
857
|
+
)
|
|
858
|
+
return CommandResult(success=False, exit_code=1)
|
|
859
|
+
|
|
860
|
+
result = self.skills_deployer.disable_collection(name)
|
|
861
|
+
|
|
862
|
+
console.print(f"\n[green]✓ {result['message']}[/green]\n")
|
|
863
|
+
|
|
864
|
+
return CommandResult(success=True, exit_code=0)
|
|
865
|
+
|
|
866
|
+
except ValueError as e:
|
|
867
|
+
console.print(f"[red]Error: {e}[/red]")
|
|
868
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
869
|
+
except Exception as e:
|
|
870
|
+
console.print(f"[red]Unexpected error: {e}[/red]")
|
|
871
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
872
|
+
|
|
873
|
+
def _collection_set_default(self, args) -> CommandResult:
|
|
874
|
+
"""Set the default collection."""
|
|
875
|
+
try:
|
|
876
|
+
name = getattr(args, "collection_name", None)
|
|
877
|
+
|
|
878
|
+
if not name:
|
|
879
|
+
console.print("[red]Error: Collection name is required[/red]")
|
|
880
|
+
console.print(
|
|
881
|
+
"[dim]Usage: claude-mpm skills collection-set-default NAME[/dim]"
|
|
882
|
+
)
|
|
883
|
+
return CommandResult(success=False, exit_code=1)
|
|
884
|
+
|
|
885
|
+
result = self.skills_deployer.set_default_collection(name)
|
|
886
|
+
|
|
887
|
+
console.print(f"\n[green]✓ {result['message']}[/green]")
|
|
888
|
+
if result.get("previous_default"):
|
|
889
|
+
console.print(f" [dim]Previous: {result['previous_default']}[/dim]")
|
|
890
|
+
console.print()
|
|
891
|
+
|
|
892
|
+
return CommandResult(success=True, exit_code=0)
|
|
893
|
+
|
|
894
|
+
except ValueError as e:
|
|
895
|
+
console.print(f"[red]Error: {e}[/red]")
|
|
896
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
897
|
+
except Exception as e:
|
|
898
|
+
console.print(f"[red]Unexpected error: {e}[/red]")
|
|
899
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
900
|
+
|
|
467
901
|
|
|
468
902
|
def manage_skills(args) -> int:
|
|
469
903
|
"""
|
claude_mpm/cli/executor.py
CHANGED
|
@@ -13,7 +13,6 @@ from .commands import (
|
|
|
13
13
|
cleanup_memory,
|
|
14
14
|
manage_agent_manager,
|
|
15
15
|
manage_agents,
|
|
16
|
-
manage_config,
|
|
17
16
|
manage_configure,
|
|
18
17
|
manage_debug,
|
|
19
18
|
manage_mcp,
|
|
@@ -126,6 +125,22 @@ def execute_command(command: str, args) -> int:
|
|
|
126
125
|
result = handle_verify(args)
|
|
127
126
|
return result if result is not None else 0
|
|
128
127
|
|
|
128
|
+
# Handle skill-source command with lazy import
|
|
129
|
+
if command == "skill-source":
|
|
130
|
+
# Lazy import to avoid loading unless needed
|
|
131
|
+
from .commands.skill_source import skill_source_command
|
|
132
|
+
|
|
133
|
+
result = skill_source_command(args)
|
|
134
|
+
return result if result is not None else 0
|
|
135
|
+
|
|
136
|
+
# Handle agent-source command with lazy import
|
|
137
|
+
if command == "agent-source":
|
|
138
|
+
# Lazy import to avoid loading unless needed
|
|
139
|
+
from .commands.agent_source import agent_source_command
|
|
140
|
+
|
|
141
|
+
result = agent_source_command(args)
|
|
142
|
+
return result if result is not None else 0
|
|
143
|
+
|
|
129
144
|
# Handle auto-configure command with lazy import
|
|
130
145
|
if command == "auto-configure":
|
|
131
146
|
# Lazy import to avoid loading unless needed
|
|
@@ -146,6 +161,62 @@ def execute_command(command: str, args) -> int:
|
|
|
146
161
|
# Convert CommandResult to exit code
|
|
147
162
|
return result.exit_code if result else 0
|
|
148
163
|
|
|
164
|
+
# Handle hook-errors command with lazy import
|
|
165
|
+
if command == "hook-errors":
|
|
166
|
+
# Lazy import to avoid loading unless needed
|
|
167
|
+
from .commands.hook_errors import (
|
|
168
|
+
clear_errors,
|
|
169
|
+
diagnose_errors,
|
|
170
|
+
list_errors,
|
|
171
|
+
show_status,
|
|
172
|
+
show_summary,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# Get subcommand
|
|
176
|
+
subcommand = getattr(args, "hook_errors_command", "status")
|
|
177
|
+
if not subcommand:
|
|
178
|
+
subcommand = "status"
|
|
179
|
+
|
|
180
|
+
# Map subcommands to functions
|
|
181
|
+
handlers = {
|
|
182
|
+
"list": list_errors,
|
|
183
|
+
"summary": show_summary,
|
|
184
|
+
"clear": clear_errors,
|
|
185
|
+
"diagnose": diagnose_errors,
|
|
186
|
+
"status": show_status,
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Get handler and invoke
|
|
190
|
+
handler = handlers.get(subcommand)
|
|
191
|
+
if handler:
|
|
192
|
+
# Build Click context programmatically
|
|
193
|
+
import click
|
|
194
|
+
|
|
195
|
+
ctx = click.Context(command=handler)
|
|
196
|
+
|
|
197
|
+
# Prepare keyword arguments from args
|
|
198
|
+
kwargs = {}
|
|
199
|
+
if hasattr(args, "format"):
|
|
200
|
+
kwargs["format"] = args.format
|
|
201
|
+
if hasattr(args, "hook_type"):
|
|
202
|
+
kwargs["hook_type"] = args.hook_type
|
|
203
|
+
if hasattr(args, "yes"):
|
|
204
|
+
kwargs["yes"] = args.yes
|
|
205
|
+
|
|
206
|
+
try:
|
|
207
|
+
# Invoke handler with arguments
|
|
208
|
+
with ctx:
|
|
209
|
+
handler.invoke(ctx, **kwargs)
|
|
210
|
+
return 0
|
|
211
|
+
except SystemExit as e:
|
|
212
|
+
return e.code if e.code is not None else 0
|
|
213
|
+
except Exception as e:
|
|
214
|
+
print(f"Error: {e}")
|
|
215
|
+
return 1
|
|
216
|
+
else:
|
|
217
|
+
print(f"Unknown hook-errors subcommand: {subcommand}")
|
|
218
|
+
return 1
|
|
219
|
+
|
|
149
220
|
# Map stable commands to their implementations
|
|
150
221
|
command_map = {
|
|
151
222
|
CLICommands.RUN.value: run_session,
|
|
@@ -157,8 +228,10 @@ def execute_command(command: str, args) -> int:
|
|
|
157
228
|
CLICommands.MEMORY.value: manage_memory,
|
|
158
229
|
CLICommands.MONITOR.value: manage_monitor,
|
|
159
230
|
CLICommands.DASHBOARD.value: manage_dashboard,
|
|
160
|
-
|
|
161
|
-
|
|
231
|
+
# Configuration management commands (synonymous)
|
|
232
|
+
# Both 'config' and 'configure' launch the interactive configuration TUI
|
|
233
|
+
CLICommands.CONFIG.value: manage_configure, # Alias to configure
|
|
234
|
+
CLICommands.CONFIGURE.value: manage_configure, # Interactive configuration TUI
|
|
162
235
|
CLICommands.AGGREGATE.value: aggregate_command,
|
|
163
236
|
CLICommands.ANALYZE_CODE.value: manage_analyze_code,
|
|
164
237
|
CLICommands.CLEANUP.value: cleanup_memory,
|
|
@@ -193,6 +266,8 @@ def execute_command(command: str, args) -> int:
|
|
|
193
266
|
"verify",
|
|
194
267
|
"auto-configure",
|
|
195
268
|
"local-deploy",
|
|
269
|
+
"skill-source",
|
|
270
|
+
"agent-source",
|
|
196
271
|
]
|
|
197
272
|
|
|
198
273
|
suggestion = suggest_similar_commands(command, all_commands)
|