claude-mpm 4.21.3__py3-none-any.whl → 5.1.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
- 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/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +69 -1
- claude_mpm/agents/templates/circuit-breakers.md +1254 -0
- 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 +37 -2
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +188 -30
- claude_mpm/cli/commands/agents.py +1128 -36
- 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 +537 -239
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +935 -45
- 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/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +125 -167
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +757 -20
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +1032 -47
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +310 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +53 -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 +145 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +564 -108
- 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-postmortem.md +123 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +19 -35
- 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/file_loader.py +54 -101
- 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 +131 -10
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +110 -8
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +129 -1
- claude_mpm/core/unified_config.py +22 -0
- 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/claude_hooks/memory_integration.py +12 -1
- 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/agent_definition.py +7 -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/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_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 +225 -18
- 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 +557 -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 +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +200 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_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/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +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_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_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/mcp_service_verifier.py +6 -3
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +29 -9
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- 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/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/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/analysis.py +1 -1
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
- 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/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -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/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.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/top_level.txt +0 -0
|
@@ -3,13 +3,16 @@ Auto-Configuration CLI Command for Claude MPM Framework
|
|
|
3
3
|
========================================================
|
|
4
4
|
|
|
5
5
|
WHY: This module provides a user-friendly CLI interface for the auto-configuration
|
|
6
|
-
feature, allowing users to automatically configure agents based on
|
|
6
|
+
feature, allowing users to automatically configure BOTH agents AND skills based on
|
|
7
|
+
detected toolchain.
|
|
7
8
|
|
|
8
9
|
DESIGN DECISION: Uses rich for beautiful terminal output, implements interactive
|
|
9
10
|
confirmation, and provides comprehensive error handling. Supports both interactive
|
|
10
|
-
and non-interactive modes for flexibility.
|
|
11
|
+
and non-interactive modes for flexibility. Orchestrates both agent auto-config
|
|
12
|
+
(via AutoConfigManagerService) and skill recommendations (via SkillsDeployer).
|
|
11
13
|
|
|
12
14
|
Part of TSK-0054: Auto-Configuration Feature - Phase 5
|
|
15
|
+
Unified Auto-Configure: 1M-502 Phase 2
|
|
13
16
|
"""
|
|
14
17
|
|
|
15
18
|
import json
|
|
@@ -29,7 +32,6 @@ except ImportError:
|
|
|
29
32
|
from ...core.enums import OperationResult
|
|
30
33
|
from ...services.agents.auto_config_manager import AutoConfigManagerService
|
|
31
34
|
from ...services.agents.observers import NullObserver
|
|
32
|
-
from ...services.core.models.agent_config import ConfigurationResult
|
|
33
35
|
from ..shared import BaseCommand, CommandResult
|
|
34
36
|
|
|
35
37
|
|
|
@@ -100,7 +102,11 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
100
102
|
Handle auto-configuration CLI commands.
|
|
101
103
|
|
|
102
104
|
This command provides a user-friendly interface for automatically configuring
|
|
103
|
-
agents based on detected project toolchain.
|
|
105
|
+
BOTH agents AND skills based on detected project toolchain.
|
|
106
|
+
|
|
107
|
+
Orchestrates:
|
|
108
|
+
1. Agent auto-configuration (via AutoConfigManagerService)
|
|
109
|
+
2. Skills recommendations and deployment (via SkillsDeployer + agent-skill mapping)
|
|
104
110
|
"""
|
|
105
111
|
|
|
106
112
|
def __init__(self):
|
|
@@ -108,19 +114,16 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
108
114
|
super().__init__("auto-configure")
|
|
109
115
|
self.console = Console() if RICH_AVAILABLE else None
|
|
110
116
|
self._auto_config_manager = None
|
|
117
|
+
self._skills_deployer = None
|
|
111
118
|
|
|
112
119
|
@property
|
|
113
120
|
def auto_config_manager(self) -> AutoConfigManagerService:
|
|
114
121
|
"""Get auto-configuration manager (lazy loaded)."""
|
|
115
122
|
if self._auto_config_manager is None:
|
|
116
|
-
from ...services.agents.auto_config_manager import
|
|
117
|
-
AutoConfigManagerService,
|
|
118
|
-
)
|
|
123
|
+
from ...services.agents.auto_config_manager import AutoConfigManagerService
|
|
119
124
|
from ...services.agents.recommender import AgentRecommenderService
|
|
120
125
|
from ...services.agents.registry import AgentRegistry
|
|
121
|
-
from ...services.project.toolchain_analyzer import
|
|
122
|
-
ToolchainAnalyzerService,
|
|
123
|
-
)
|
|
126
|
+
from ...services.project.toolchain_analyzer import ToolchainAnalyzerService
|
|
124
127
|
|
|
125
128
|
# Initialize services with dependency injection
|
|
126
129
|
toolchain_analyzer = ToolchainAnalyzerService()
|
|
@@ -144,6 +147,15 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
144
147
|
|
|
145
148
|
return self._auto_config_manager
|
|
146
149
|
|
|
150
|
+
@property
|
|
151
|
+
def skills_deployer(self):
|
|
152
|
+
"""Get skills deployer instance (lazy loaded)."""
|
|
153
|
+
if self._skills_deployer is None:
|
|
154
|
+
from ...services.skills_deployer import SkillsDeployerService
|
|
155
|
+
|
|
156
|
+
self._skills_deployer = SkillsDeployerService()
|
|
157
|
+
return self._skills_deployer
|
|
158
|
+
|
|
147
159
|
def validate_args(self, args) -> Optional[str]:
|
|
148
160
|
"""Validate command arguments."""
|
|
149
161
|
# Validate project path
|
|
@@ -195,11 +207,26 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
195
207
|
skip_confirmation = args.yes if hasattr(args, "yes") and args.yes else False
|
|
196
208
|
json_output = args.json if hasattr(args, "json") and args.json else False
|
|
197
209
|
|
|
210
|
+
# Determine what to configure (agents, skills, or both)
|
|
211
|
+
configure_agents = not getattr(args, "skills_only", False)
|
|
212
|
+
configure_skills = not getattr(args, "agents_only", False)
|
|
213
|
+
|
|
198
214
|
# Run preview or full configuration
|
|
199
215
|
if dry_run or args.preview if hasattr(args, "preview") else False:
|
|
200
|
-
return self._run_preview(
|
|
216
|
+
return self._run_preview(
|
|
217
|
+
project_path,
|
|
218
|
+
min_confidence,
|
|
219
|
+
json_output,
|
|
220
|
+
configure_agents,
|
|
221
|
+
configure_skills,
|
|
222
|
+
)
|
|
201
223
|
return self._run_full_configuration(
|
|
202
|
-
project_path,
|
|
224
|
+
project_path,
|
|
225
|
+
min_confidence,
|
|
226
|
+
skip_confirmation,
|
|
227
|
+
json_output,
|
|
228
|
+
configure_agents,
|
|
229
|
+
configure_skills,
|
|
203
230
|
)
|
|
204
231
|
|
|
205
232
|
except KeyboardInterrupt:
|
|
@@ -219,24 +246,47 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
219
246
|
return CommandResult.error_result(error_msg)
|
|
220
247
|
|
|
221
248
|
def _run_preview(
|
|
222
|
-
self,
|
|
249
|
+
self,
|
|
250
|
+
project_path: Path,
|
|
251
|
+
min_confidence: float,
|
|
252
|
+
json_output: bool,
|
|
253
|
+
configure_agents: bool = True,
|
|
254
|
+
configure_skills: bool = True,
|
|
223
255
|
) -> CommandResult:
|
|
224
256
|
"""Run configuration preview without deploying."""
|
|
225
|
-
#
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
257
|
+
# Get agent preview
|
|
258
|
+
agent_preview = None
|
|
259
|
+
if configure_agents:
|
|
260
|
+
if self.console and not json_output:
|
|
261
|
+
with self.console.status("[bold green]Analyzing project toolchain..."):
|
|
262
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
263
|
+
project_path, min_confidence
|
|
264
|
+
)
|
|
265
|
+
else:
|
|
266
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
229
267
|
project_path, min_confidence
|
|
230
268
|
)
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
269
|
+
|
|
270
|
+
# Get skills recommendations
|
|
271
|
+
skills_recommendations = None
|
|
272
|
+
if configure_skills:
|
|
273
|
+
if self.console and not json_output:
|
|
274
|
+
with self.console.status("[bold green]Analyzing skill requirements..."):
|
|
275
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
276
|
+
else:
|
|
277
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
235
278
|
|
|
236
279
|
# Output results
|
|
237
280
|
if json_output:
|
|
238
|
-
return self._output_preview_json(
|
|
239
|
-
|
|
281
|
+
return self._output_preview_json(
|
|
282
|
+
agent_preview,
|
|
283
|
+
skills_recommendations,
|
|
284
|
+
configure_agents,
|
|
285
|
+
configure_skills,
|
|
286
|
+
)
|
|
287
|
+
return self._display_preview(
|
|
288
|
+
agent_preview, skills_recommendations, configure_agents, configure_skills
|
|
289
|
+
)
|
|
240
290
|
|
|
241
291
|
def _run_full_configuration(
|
|
242
292
|
self,
|
|
@@ -244,147 +294,251 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
244
294
|
min_confidence: float,
|
|
245
295
|
skip_confirmation: bool,
|
|
246
296
|
json_output: bool,
|
|
297
|
+
configure_agents: bool = True,
|
|
298
|
+
configure_skills: bool = True,
|
|
247
299
|
) -> CommandResult:
|
|
248
300
|
"""Run full auto-configuration with deployment."""
|
|
249
|
-
# Get preview
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
301
|
+
# Get agent preview
|
|
302
|
+
agent_preview = None
|
|
303
|
+
if configure_agents:
|
|
304
|
+
if self.console and not json_output:
|
|
305
|
+
with self.console.status("[bold green]Analyzing project toolchain..."):
|
|
306
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
307
|
+
project_path, min_confidence
|
|
308
|
+
)
|
|
309
|
+
else:
|
|
310
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
253
311
|
project_path, min_confidence
|
|
254
312
|
)
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
313
|
+
|
|
314
|
+
# Get skills recommendations
|
|
315
|
+
skills_recommendations = None
|
|
316
|
+
if configure_skills:
|
|
317
|
+
if self.console and not json_output:
|
|
318
|
+
with self.console.status("[bold green]Analyzing skill requirements..."):
|
|
319
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
320
|
+
else:
|
|
321
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
259
322
|
|
|
260
323
|
# Display preview (unless JSON output)
|
|
261
324
|
if not json_output:
|
|
262
|
-
self._display_preview(
|
|
325
|
+
self._display_preview(
|
|
326
|
+
agent_preview,
|
|
327
|
+
skills_recommendations,
|
|
328
|
+
configure_agents,
|
|
329
|
+
configure_skills,
|
|
330
|
+
)
|
|
263
331
|
|
|
264
332
|
# Ask for confirmation (unless skipped)
|
|
265
333
|
if not skip_confirmation and not json_output:
|
|
266
|
-
if not self._confirm_deployment(
|
|
334
|
+
if not self._confirm_deployment(
|
|
335
|
+
agent_preview,
|
|
336
|
+
skills_recommendations,
|
|
337
|
+
configure_agents,
|
|
338
|
+
configure_skills,
|
|
339
|
+
):
|
|
267
340
|
if self.console:
|
|
268
341
|
self.console.print("\n❌ Operation cancelled by user")
|
|
269
342
|
else:
|
|
270
343
|
print("\nOperation cancelled by user")
|
|
271
344
|
return CommandResult.error_result("Operation cancelled", exit_code=0)
|
|
272
345
|
|
|
273
|
-
# Execute configuration
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
self.
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
346
|
+
# Execute agent configuration
|
|
347
|
+
agent_result = None
|
|
348
|
+
if configure_agents and agent_preview:
|
|
349
|
+
import asyncio
|
|
350
|
+
|
|
351
|
+
observer = RichProgressObserver(self.console) if self.console else None
|
|
352
|
+
agent_result = asyncio.run(
|
|
353
|
+
self.auto_config_manager.auto_configure(
|
|
354
|
+
project_path,
|
|
355
|
+
confirmation_required=False, # Already confirmed above
|
|
356
|
+
dry_run=False,
|
|
357
|
+
min_confidence=min_confidence,
|
|
358
|
+
observer=observer,
|
|
359
|
+
)
|
|
284
360
|
)
|
|
285
|
-
|
|
361
|
+
|
|
362
|
+
# Deploy skills
|
|
363
|
+
skills_result = None
|
|
364
|
+
if configure_skills and skills_recommendations:
|
|
365
|
+
if self.console and not json_output:
|
|
366
|
+
self.console.print("\n[bold cyan]Deploying skills...[/bold cyan]\n")
|
|
367
|
+
skills_result = self._deploy_skills(skills_recommendations)
|
|
286
368
|
|
|
287
369
|
# Output results
|
|
288
370
|
if json_output:
|
|
289
|
-
return self._output_result_json(
|
|
290
|
-
return self._display_result(
|
|
371
|
+
return self._output_result_json(agent_result, skills_result)
|
|
372
|
+
return self._display_result(agent_result, skills_result)
|
|
291
373
|
|
|
292
|
-
def _display_preview(
|
|
374
|
+
def _display_preview(
|
|
375
|
+
self,
|
|
376
|
+
agent_preview,
|
|
377
|
+
skills_recommendations=None,
|
|
378
|
+
configure_agents=True,
|
|
379
|
+
configure_skills=True,
|
|
380
|
+
) -> CommandResult:
|
|
293
381
|
"""Display configuration preview with Rich formatting."""
|
|
294
382
|
if not self.console:
|
|
295
383
|
# Fallback to plain text
|
|
296
|
-
return self._display_preview_plain(
|
|
384
|
+
return self._display_preview_plain(
|
|
385
|
+
agent_preview,
|
|
386
|
+
skills_recommendations,
|
|
387
|
+
configure_agents,
|
|
388
|
+
configure_skills,
|
|
389
|
+
)
|
|
297
390
|
|
|
298
|
-
#
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
toolchain_table = Table(show_header=True, header_style="bold")
|
|
302
|
-
toolchain_table.add_column("Component", style="cyan")
|
|
303
|
-
toolchain_table.add_column("Version", style="yellow")
|
|
304
|
-
toolchain_table.add_column("Confidence", style="green")
|
|
305
|
-
|
|
306
|
-
for component in preview.detected_toolchain.components:
|
|
307
|
-
confidence_pct = int(component.confidence * 100)
|
|
308
|
-
bar = "█" * (confidence_pct // 10) + "░" * (10 - confidence_pct // 10)
|
|
309
|
-
confidence_str = f"{bar} {confidence_pct}%"
|
|
310
|
-
|
|
311
|
-
toolchain_table.add_row(
|
|
312
|
-
(
|
|
313
|
-
component.type.value
|
|
314
|
-
if hasattr(component.type, "value")
|
|
315
|
-
else str(component.type)
|
|
316
|
-
),
|
|
317
|
-
component.version or "Unknown",
|
|
318
|
-
confidence_str,
|
|
319
|
-
)
|
|
391
|
+
# Only show toolchain and agents if configuring agents
|
|
392
|
+
if not configure_agents:
|
|
393
|
+
agent_preview = None
|
|
320
394
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
self.console.print("
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
self.console.print(
|
|
395
|
+
# Display detected toolchain
|
|
396
|
+
if configure_agents and agent_preview:
|
|
397
|
+
self.console.print("\n📊 Detected Toolchain:", style="bold blue")
|
|
398
|
+
if (
|
|
399
|
+
agent_preview.detected_toolchain
|
|
400
|
+
and agent_preview.detected_toolchain.components
|
|
401
|
+
):
|
|
402
|
+
toolchain_table = Table(show_header=True, header_style="bold")
|
|
403
|
+
toolchain_table.add_column("Component", style="cyan")
|
|
404
|
+
toolchain_table.add_column("Version", style="yellow")
|
|
405
|
+
toolchain_table.add_column("Confidence", style="green")
|
|
406
|
+
|
|
407
|
+
for component in agent_preview.detected_toolchain.components:
|
|
408
|
+
confidence_pct = int(component.confidence * 100)
|
|
409
|
+
bar = "█" * (confidence_pct // 10) + "░" * (
|
|
410
|
+
10 - confidence_pct // 10
|
|
411
|
+
)
|
|
412
|
+
confidence_str = f"{bar} {confidence_pct}%"
|
|
413
|
+
|
|
414
|
+
toolchain_table.add_row(
|
|
415
|
+
(
|
|
416
|
+
component.type.value
|
|
417
|
+
if hasattr(component.type, "value")
|
|
418
|
+
else str(component.type)
|
|
419
|
+
),
|
|
420
|
+
component.version or "Unknown",
|
|
421
|
+
confidence_str,
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
self.console.print(toolchain_table)
|
|
425
|
+
else:
|
|
426
|
+
self.console.print(" No toolchain detected", style="yellow")
|
|
427
|
+
|
|
428
|
+
# Display recommended agents
|
|
429
|
+
self.console.print("\n🤖 Recommended Agents:", style="bold blue")
|
|
430
|
+
if agent_preview.recommendations:
|
|
431
|
+
for rec in agent_preview.recommendations:
|
|
432
|
+
confidence_pct = int(rec.confidence * 100)
|
|
433
|
+
icon = "✓" if rec.confidence >= 0.8 else "○"
|
|
434
|
+
self.console.print(
|
|
435
|
+
f" {icon} [bold]{rec.agent_id}[/bold] ({confidence_pct}% confidence)"
|
|
436
|
+
)
|
|
437
|
+
self.console.print(f" Reason: {rec.reasoning}", style="dim")
|
|
438
|
+
else:
|
|
439
|
+
self.console.print(" No agents recommended", style="yellow")
|
|
440
|
+
|
|
441
|
+
# Display validation issues
|
|
442
|
+
if (
|
|
443
|
+
agent_preview.validation_result
|
|
444
|
+
and agent_preview.validation_result.issues
|
|
445
|
+
):
|
|
446
|
+
self.console.print("\n⚠️ Validation Issues:", style="bold yellow")
|
|
447
|
+
for issue in agent_preview.validation_result.issues:
|
|
448
|
+
severity_icon = {"error": "❌", "warning": "⚠️", "info": "ℹ️"}.get(
|
|
449
|
+
(
|
|
450
|
+
issue.severity.value
|
|
451
|
+
if hasattr(issue.severity, "value")
|
|
452
|
+
else str(issue.severity)
|
|
453
|
+
),
|
|
454
|
+
"•",
|
|
455
|
+
)
|
|
456
|
+
self.console.print(
|
|
457
|
+
f" {severity_icon} {issue.message}", style="yellow"
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
# Display recommended skills
|
|
461
|
+
if configure_skills and skills_recommendations:
|
|
462
|
+
self.console.print("\n🎯 Recommended Skills:", style="bold blue")
|
|
463
|
+
for skill in skills_recommendations:
|
|
464
|
+
self.console.print(f" ✓ [bold]{skill}[/bold]")
|
|
351
465
|
|
|
352
466
|
return CommandResult.success_result()
|
|
353
467
|
|
|
354
|
-
def _display_preview_plain(
|
|
468
|
+
def _display_preview_plain(
|
|
469
|
+
self,
|
|
470
|
+
agent_preview,
|
|
471
|
+
skills_recommendations=None,
|
|
472
|
+
configure_agents=True,
|
|
473
|
+
configure_skills=True,
|
|
474
|
+
) -> CommandResult:
|
|
355
475
|
"""Display preview in plain text (fallback when Rich not available)."""
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
print(
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
476
|
+
if configure_agents and agent_preview:
|
|
477
|
+
print("\nDetected Toolchain:")
|
|
478
|
+
if (
|
|
479
|
+
agent_preview.detected_toolchain
|
|
480
|
+
and agent_preview.detected_toolchain.components
|
|
481
|
+
):
|
|
482
|
+
for component in agent_preview.detected_toolchain.components:
|
|
483
|
+
confidence_pct = int(component.confidence * 100)
|
|
484
|
+
print(
|
|
485
|
+
f" - {component.type}: {component.version} ({confidence_pct}%)"
|
|
486
|
+
)
|
|
487
|
+
else:
|
|
488
|
+
print(" No toolchain detected")
|
|
489
|
+
|
|
490
|
+
print("\nRecommended Agents:")
|
|
491
|
+
if agent_preview.recommendations:
|
|
492
|
+
for rec in agent_preview.recommendations:
|
|
493
|
+
confidence_pct = int(rec.confidence * 100)
|
|
494
|
+
print(f" - {rec.agent_id} ({confidence_pct}%)")
|
|
495
|
+
print(f" Reason: {rec.reasoning}")
|
|
496
|
+
else:
|
|
497
|
+
print(" No agents recommended")
|
|
498
|
+
|
|
499
|
+
if (
|
|
500
|
+
agent_preview.validation_result
|
|
501
|
+
and agent_preview.validation_result.issues
|
|
502
|
+
):
|
|
503
|
+
print("\nValidation Issues:")
|
|
504
|
+
for issue in agent_preview.validation_result.issues:
|
|
505
|
+
print(f" - {issue.severity}: {issue.message}")
|
|
372
506
|
|
|
373
|
-
if
|
|
374
|
-
print("\
|
|
375
|
-
for
|
|
376
|
-
print(f" - {
|
|
507
|
+
if configure_skills and skills_recommendations:
|
|
508
|
+
print("\nRecommended Skills:")
|
|
509
|
+
for skill in skills_recommendations:
|
|
510
|
+
print(f" - {skill}")
|
|
377
511
|
|
|
378
512
|
return CommandResult.success_result()
|
|
379
513
|
|
|
380
|
-
def _confirm_deployment(
|
|
514
|
+
def _confirm_deployment(
|
|
515
|
+
self,
|
|
516
|
+
agent_preview,
|
|
517
|
+
skills_recommendations=None,
|
|
518
|
+
configure_agents=True,
|
|
519
|
+
configure_skills=True,
|
|
520
|
+
) -> bool:
|
|
381
521
|
"""Ask user to confirm deployment."""
|
|
382
|
-
|
|
522
|
+
has_agents = (
|
|
523
|
+
configure_agents and agent_preview and agent_preview.recommendations
|
|
524
|
+
)
|
|
525
|
+
has_skills = configure_skills and skills_recommendations
|
|
526
|
+
|
|
527
|
+
if not has_agents and not has_skills:
|
|
383
528
|
return False
|
|
384
529
|
|
|
530
|
+
# Build confirmation message
|
|
531
|
+
items = []
|
|
532
|
+
if has_agents:
|
|
533
|
+
items.append(f"{len(agent_preview.recommendations)} agent(s)")
|
|
534
|
+
if has_skills:
|
|
535
|
+
items.append(f"{len(skills_recommendations)} skill(s)")
|
|
536
|
+
|
|
537
|
+
message = f"Deploy {' and '.join(items)}?"
|
|
538
|
+
|
|
385
539
|
if self.console:
|
|
386
540
|
self.console.print("\n" + "=" * 60)
|
|
387
|
-
self.console.print(
|
|
541
|
+
self.console.print(message, style="bold yellow")
|
|
388
542
|
self.console.print("=" * 60)
|
|
389
543
|
response = (
|
|
390
544
|
self.console.input("\n[bold]Proceed? (y/n/s for select):[/bold] ")
|
|
@@ -393,7 +547,7 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
393
547
|
)
|
|
394
548
|
else:
|
|
395
549
|
print("\n" + "=" * 60)
|
|
396
|
-
print(
|
|
550
|
+
print(message)
|
|
397
551
|
print("=" * 60)
|
|
398
552
|
response = input("\nProceed? (y/n/s for select): ").strip().lower()
|
|
399
553
|
|
|
@@ -411,160 +565,304 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
411
565
|
return False
|
|
412
566
|
return False
|
|
413
567
|
|
|
414
|
-
def _display_result(
|
|
568
|
+
def _display_result(
|
|
569
|
+
self, agent_result: Optional = None, skills_result: Optional[dict] = None
|
|
570
|
+
) -> CommandResult:
|
|
415
571
|
"""Display configuration result."""
|
|
416
572
|
if not self.console:
|
|
417
|
-
return self._display_result_plain(
|
|
573
|
+
return self._display_result_plain(agent_result, skills_result)
|
|
574
|
+
|
|
575
|
+
# Determine overall success
|
|
576
|
+
agent_success = (
|
|
577
|
+
(agent_result and agent_result.status == OperationResult.SUCCESS)
|
|
578
|
+
if agent_result
|
|
579
|
+
else True
|
|
580
|
+
)
|
|
581
|
+
skills_success = not skills_result or (
|
|
582
|
+
skills_result and not skills_result.get("errors")
|
|
583
|
+
)
|
|
584
|
+
overall_success = agent_success and skills_success
|
|
418
585
|
|
|
419
586
|
# Display summary
|
|
420
|
-
if
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
587
|
+
if overall_success:
|
|
588
|
+
# Build summary message
|
|
589
|
+
deployed_items = []
|
|
590
|
+
if agent_result and agent_result.deployed_agents:
|
|
591
|
+
deployed_items.append(f"{len(agent_result.deployed_agents)} agent(s)")
|
|
592
|
+
if skills_result and skills_result.get("deployed"):
|
|
593
|
+
deployed_items.append(f"{len(skills_result['deployed'])} skill(s)")
|
|
594
|
+
|
|
595
|
+
panel_text = "✅ Auto-configuration completed successfully!\n\n"
|
|
596
|
+
if deployed_items:
|
|
597
|
+
panel_text += f"Deployed {' and '.join(deployed_items)}"
|
|
598
|
+
else:
|
|
599
|
+
panel_text += "No deployments needed"
|
|
600
|
+
|
|
601
|
+
panel = Panel(panel_text, title="Success", border_style="green")
|
|
427
602
|
self.console.print(panel)
|
|
428
603
|
|
|
429
604
|
# Show deployed agents
|
|
430
|
-
if
|
|
605
|
+
if agent_result and agent_result.deployed_agents:
|
|
431
606
|
self.console.print("\n📦 Deployed Agents:", style="bold green")
|
|
432
|
-
for agent_id in
|
|
607
|
+
for agent_id in agent_result.deployed_agents:
|
|
433
608
|
self.console.print(f" ✓ {agent_id}")
|
|
434
609
|
|
|
610
|
+
# Show deployed skills
|
|
611
|
+
if skills_result and skills_result.get("deployed"):
|
|
612
|
+
self.console.print("\n🎯 Deployed Skills:", style="bold green")
|
|
613
|
+
for skill in skills_result["deployed"]:
|
|
614
|
+
self.console.print(f" ✓ {skill}")
|
|
615
|
+
|
|
435
616
|
return CommandResult.success_result()
|
|
436
617
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
)
|
|
445
|
-
self.console.print(panel)
|
|
618
|
+
# Partial or complete failure
|
|
619
|
+
has_errors = False
|
|
620
|
+
if agent_result and agent_result.status in [
|
|
621
|
+
OperationResult.WARNING,
|
|
622
|
+
OperationResult.FAILED,
|
|
623
|
+
]:
|
|
624
|
+
has_errors = True
|
|
446
625
|
|
|
447
|
-
if
|
|
626
|
+
if agent_result.status == OperationResult.WARNING:
|
|
627
|
+
self.console.print(
|
|
628
|
+
"\n⚠️ Agent configuration partially completed", style="yellow"
|
|
629
|
+
)
|
|
630
|
+
else:
|
|
631
|
+
self.console.print("\n❌ Agent configuration failed", style="red")
|
|
632
|
+
|
|
633
|
+
if agent_result.failed_agents:
|
|
448
634
|
self.console.print("\n❌ Failed Agents:", style="bold red")
|
|
449
|
-
for agent_id in
|
|
450
|
-
error =
|
|
635
|
+
for agent_id in agent_result.failed_agents:
|
|
636
|
+
error = agent_result.errors.get(agent_id, "Unknown error")
|
|
451
637
|
self.console.print(f" ✗ {agent_id}: {error}")
|
|
452
638
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
639
|
+
if skills_result and skills_result.get("errors"):
|
|
640
|
+
has_errors = True
|
|
641
|
+
self.console.print("\n❌ Skill deployment failed", style="red")
|
|
642
|
+
for error in skills_result["errors"]:
|
|
643
|
+
self.console.print(f" ✗ {error}")
|
|
644
|
+
|
|
645
|
+
return (
|
|
646
|
+
CommandResult.error_result(
|
|
647
|
+
"Configuration partially succeeded"
|
|
648
|
+
if (agent_success or skills_success)
|
|
649
|
+
else "Configuration failed",
|
|
650
|
+
exit_code=1,
|
|
651
|
+
)
|
|
652
|
+
if has_errors
|
|
653
|
+
else CommandResult.success_result()
|
|
459
654
|
)
|
|
460
|
-
self.console.print(panel)
|
|
461
|
-
|
|
462
|
-
return CommandResult.error_result("Configuration failed", exit_code=1)
|
|
463
655
|
|
|
464
|
-
def _display_result_plain(
|
|
656
|
+
def _display_result_plain(
|
|
657
|
+
self, agent_result: Optional = None, skills_result: Optional[dict] = None
|
|
658
|
+
) -> CommandResult:
|
|
465
659
|
"""Display result in plain text (fallback)."""
|
|
466
|
-
|
|
660
|
+
# Determine overall success
|
|
661
|
+
agent_success = (
|
|
662
|
+
(agent_result and agent_result.status == OperationResult.SUCCESS)
|
|
663
|
+
if agent_result
|
|
664
|
+
else True
|
|
665
|
+
)
|
|
666
|
+
skills_success = not skills_result or not skills_result.get("errors")
|
|
667
|
+
overall_success = agent_success and skills_success
|
|
668
|
+
|
|
669
|
+
if overall_success:
|
|
467
670
|
print("\n✅ Auto-configuration completed successfully!")
|
|
468
|
-
print(f"Deployed {len(result.deployed_agents)} agent(s)")
|
|
469
671
|
|
|
470
|
-
if
|
|
672
|
+
if agent_result and agent_result.deployed_agents:
|
|
673
|
+
print(f"Deployed {len(agent_result.deployed_agents)} agent(s)")
|
|
471
674
|
print("\nDeployed Agents:")
|
|
472
|
-
for agent_id in
|
|
675
|
+
for agent_id in agent_result.deployed_agents:
|
|
473
676
|
print(f" - {agent_id}")
|
|
474
677
|
|
|
678
|
+
if skills_result and skills_result.get("deployed"):
|
|
679
|
+
print(f"\nDeployed {len(skills_result['deployed'])} skill(s)")
|
|
680
|
+
print("\nDeployed Skills:")
|
|
681
|
+
for skill in skills_result["deployed"]:
|
|
682
|
+
print(f" - {skill}")
|
|
683
|
+
|
|
475
684
|
return CommandResult.success_result()
|
|
476
685
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
686
|
+
# Partial or complete failure
|
|
687
|
+
has_errors = False
|
|
688
|
+
if agent_result and agent_result.status in [
|
|
689
|
+
OperationResult.WARNING,
|
|
690
|
+
OperationResult.FAILED,
|
|
691
|
+
]:
|
|
692
|
+
has_errors = True
|
|
693
|
+
print(
|
|
694
|
+
"\n⚠️ Agent configuration partially completed"
|
|
695
|
+
if agent_result.status == OperationResult.WARNING
|
|
696
|
+
else "\n❌ Agent configuration failed"
|
|
697
|
+
)
|
|
481
698
|
|
|
482
|
-
if
|
|
699
|
+
if agent_result.failed_agents:
|
|
483
700
|
print("\nFailed Agents:")
|
|
484
|
-
for agent_id in
|
|
485
|
-
error =
|
|
701
|
+
for agent_id in agent_result.failed_agents:
|
|
702
|
+
error = agent_result.errors.get(agent_id, "Unknown error")
|
|
486
703
|
print(f" - {agent_id}: {error}")
|
|
487
704
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
705
|
+
if skills_result and skills_result.get("errors"):
|
|
706
|
+
has_errors = True
|
|
707
|
+
print("\n❌ Skill deployment failed")
|
|
708
|
+
for error in skills_result["errors"]:
|
|
709
|
+
print(f" - {error}")
|
|
710
|
+
|
|
711
|
+
return (
|
|
712
|
+
CommandResult.error_result(
|
|
713
|
+
"Configuration partially succeeded"
|
|
714
|
+
if (agent_success or skills_success)
|
|
715
|
+
else "Configuration failed",
|
|
716
|
+
exit_code=1,
|
|
717
|
+
)
|
|
718
|
+
if has_errors
|
|
719
|
+
else CommandResult.success_result()
|
|
720
|
+
)
|
|
494
721
|
|
|
495
|
-
def _output_preview_json(
|
|
722
|
+
def _output_preview_json(
|
|
723
|
+
self,
|
|
724
|
+
agent_preview,
|
|
725
|
+
skills_recommendations=None,
|
|
726
|
+
configure_agents=True,
|
|
727
|
+
configure_skills=True,
|
|
728
|
+
) -> CommandResult:
|
|
496
729
|
"""Output preview as JSON."""
|
|
497
|
-
output = {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
730
|
+
output = {}
|
|
731
|
+
|
|
732
|
+
if configure_agents and agent_preview:
|
|
733
|
+
output["agents"] = {
|
|
734
|
+
"detected_toolchain": {
|
|
735
|
+
"components": (
|
|
736
|
+
[
|
|
737
|
+
{
|
|
738
|
+
"type": (
|
|
739
|
+
c.type.value
|
|
740
|
+
if hasattr(c.type, "value")
|
|
741
|
+
else str(c.type)
|
|
742
|
+
),
|
|
743
|
+
"version": c.version,
|
|
744
|
+
"confidence": c.confidence,
|
|
745
|
+
}
|
|
746
|
+
for c in agent_preview.detected_toolchain.components
|
|
747
|
+
]
|
|
748
|
+
if agent_preview.detected_toolchain
|
|
749
|
+
else []
|
|
750
|
+
)
|
|
751
|
+
},
|
|
752
|
+
"recommendations": [
|
|
753
|
+
{
|
|
754
|
+
"agent_id": r.agent_id,
|
|
755
|
+
"confidence": r.confidence,
|
|
756
|
+
"reasoning": r.reasoning,
|
|
757
|
+
}
|
|
758
|
+
for r in agent_preview.recommendations
|
|
759
|
+
],
|
|
760
|
+
"validation": {
|
|
761
|
+
"is_valid": (
|
|
762
|
+
agent_preview.validation_result.is_valid
|
|
763
|
+
if agent_preview.validation_result
|
|
764
|
+
else True
|
|
765
|
+
),
|
|
766
|
+
"issues": (
|
|
767
|
+
[
|
|
768
|
+
{
|
|
769
|
+
"severity": (
|
|
770
|
+
i.severity.value
|
|
771
|
+
if hasattr(i.severity, "value")
|
|
772
|
+
else str(i.severity)
|
|
773
|
+
),
|
|
774
|
+
"message": i.message,
|
|
775
|
+
}
|
|
776
|
+
for i in agent_preview.validation_result.issues
|
|
777
|
+
]
|
|
778
|
+
if agent_preview.validation_result
|
|
779
|
+
else []
|
|
780
|
+
),
|
|
781
|
+
},
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
if configure_skills and skills_recommendations:
|
|
785
|
+
output["skills"] = {
|
|
786
|
+
"recommendations": skills_recommendations,
|
|
787
|
+
}
|
|
547
788
|
|
|
548
789
|
print(json.dumps(output, indent=2))
|
|
549
790
|
return CommandResult.success_result(data=output)
|
|
550
791
|
|
|
551
|
-
def _output_result_json(
|
|
792
|
+
def _output_result_json(
|
|
793
|
+
self, agent_result: Optional = None, skills_result: Optional[dict] = None
|
|
794
|
+
) -> CommandResult:
|
|
552
795
|
"""Output result as JSON."""
|
|
553
|
-
output = {
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
796
|
+
output = {}
|
|
797
|
+
|
|
798
|
+
if agent_result:
|
|
799
|
+
output["agents"] = {
|
|
800
|
+
"status": (
|
|
801
|
+
agent_result.status.value
|
|
802
|
+
if hasattr(agent_result.status, "value")
|
|
803
|
+
else str(agent_result.status)
|
|
804
|
+
),
|
|
805
|
+
"deployed_agents": agent_result.deployed_agents,
|
|
806
|
+
"failed_agents": agent_result.failed_agents,
|
|
807
|
+
"errors": agent_result.errors,
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
if skills_result:
|
|
811
|
+
output["skills"] = skills_result
|
|
563
812
|
|
|
564
813
|
print(json.dumps(output, indent=2))
|
|
565
814
|
|
|
566
|
-
|
|
815
|
+
# Determine overall success
|
|
816
|
+
agent_success = (
|
|
817
|
+
agent_result.status == OperationResult.SUCCESS if agent_result else True
|
|
818
|
+
)
|
|
819
|
+
skills_success = not skills_result or not skills_result.get("errors")
|
|
820
|
+
overall_success = agent_success and skills_success
|
|
821
|
+
|
|
822
|
+
if overall_success:
|
|
567
823
|
return CommandResult.success_result(data=output)
|
|
568
824
|
return CommandResult.error_result(
|
|
569
825
|
"Configuration failed or partial", exit_code=1, data=output
|
|
570
826
|
)
|
|
827
|
+
|
|
828
|
+
def _recommend_skills(self, agent_preview):
|
|
829
|
+
"""Recommend skills based on deployed/recommended agents.
|
|
830
|
+
|
|
831
|
+
Args:
|
|
832
|
+
agent_preview: Agent preview result with recommendations
|
|
833
|
+
|
|
834
|
+
Returns:
|
|
835
|
+
List of recommended skill names, or None if no agents recommended
|
|
836
|
+
"""
|
|
837
|
+
if not agent_preview or not agent_preview.recommendations:
|
|
838
|
+
return None
|
|
839
|
+
|
|
840
|
+
# Import agent-skill mapping
|
|
841
|
+
from ...cli.interactive.skills_wizard import AGENT_SKILL_MAPPING
|
|
842
|
+
|
|
843
|
+
# Collect recommended skills based on agent types
|
|
844
|
+
recommended_skills = set()
|
|
845
|
+
for rec in agent_preview.recommendations:
|
|
846
|
+
agent_id = rec.agent_id
|
|
847
|
+
# Map agent ID to skill recommendations
|
|
848
|
+
if agent_id in AGENT_SKILL_MAPPING:
|
|
849
|
+
recommended_skills.update(AGENT_SKILL_MAPPING[agent_id])
|
|
850
|
+
|
|
851
|
+
return list(recommended_skills) if recommended_skills else None
|
|
852
|
+
|
|
853
|
+
def _deploy_skills(self, recommended_skills: list[str]) -> dict:
|
|
854
|
+
"""Deploy recommended skills.
|
|
855
|
+
|
|
856
|
+
Args:
|
|
857
|
+
recommended_skills: List of skill names to deploy
|
|
858
|
+
|
|
859
|
+
Returns:
|
|
860
|
+
Dict with deployment results: {"deployed": [...], "errors": [...]}
|
|
861
|
+
"""
|
|
862
|
+
try:
|
|
863
|
+
return self.skills_deployer.deploy_skills(
|
|
864
|
+
skill_names=recommended_skills, force=False
|
|
865
|
+
)
|
|
866
|
+
except Exception as e:
|
|
867
|
+
self.logger.error(f"Failed to deploy skills: {e}")
|
|
868
|
+
return {"deployed": [], "errors": [str(e)]}
|