claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__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/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -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/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- 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 +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- 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 +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- 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 +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- 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-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -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/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- 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/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- 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/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -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 +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -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 +238 -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 +422 -31
- 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 +841 -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 +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- 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/recommender.py +5 -3
- 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 +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -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/command_deployment_service.py +271 -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 +2 -4
- 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/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -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 +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -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/profile_manager.py +331 -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 +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- 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/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/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- 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/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- 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 -183
- 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 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/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 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -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/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- 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/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- 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/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- 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/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- 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/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- 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/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- 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-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /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.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.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
|
|
@@ -18,7 +21,6 @@ from typing import Optional
|
|
|
18
21
|
|
|
19
22
|
try:
|
|
20
23
|
from rich.console import Console
|
|
21
|
-
from rich.panel import Panel
|
|
22
24
|
from rich.progress import BarColumn, Progress, SpinnerColumn, TextColumn
|
|
23
25
|
from rich.table import Table
|
|
24
26
|
|
|
@@ -29,7 +31,6 @@ except ImportError:
|
|
|
29
31
|
from ...core.enums import OperationResult
|
|
30
32
|
from ...services.agents.auto_config_manager import AutoConfigManagerService
|
|
31
33
|
from ...services.agents.observers import NullObserver
|
|
32
|
-
from ...services.core.models.agent_config import ConfigurationResult
|
|
33
34
|
from ..shared import BaseCommand, CommandResult
|
|
34
35
|
|
|
35
36
|
|
|
@@ -100,7 +101,11 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
100
101
|
Handle auto-configuration CLI commands.
|
|
101
102
|
|
|
102
103
|
This command provides a user-friendly interface for automatically configuring
|
|
103
|
-
agents based on detected project toolchain.
|
|
104
|
+
BOTH agents AND skills based on detected project toolchain.
|
|
105
|
+
|
|
106
|
+
Orchestrates:
|
|
107
|
+
1. Agent auto-configuration (via AutoConfigManagerService)
|
|
108
|
+
2. Skills recommendations and deployment (via SkillsDeployer + agent-skill mapping)
|
|
104
109
|
"""
|
|
105
110
|
|
|
106
111
|
def __init__(self):
|
|
@@ -108,19 +113,16 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
108
113
|
super().__init__("auto-configure")
|
|
109
114
|
self.console = Console() if RICH_AVAILABLE else None
|
|
110
115
|
self._auto_config_manager = None
|
|
116
|
+
self._skills_deployer = None
|
|
111
117
|
|
|
112
118
|
@property
|
|
113
119
|
def auto_config_manager(self) -> AutoConfigManagerService:
|
|
114
120
|
"""Get auto-configuration manager (lazy loaded)."""
|
|
115
121
|
if self._auto_config_manager is None:
|
|
116
|
-
from ...services.agents.auto_config_manager import
|
|
117
|
-
AutoConfigManagerService,
|
|
118
|
-
)
|
|
122
|
+
from ...services.agents.auto_config_manager import AutoConfigManagerService
|
|
119
123
|
from ...services.agents.recommender import AgentRecommenderService
|
|
120
124
|
from ...services.agents.registry import AgentRegistry
|
|
121
|
-
from ...services.project.toolchain_analyzer import
|
|
122
|
-
ToolchainAnalyzerService,
|
|
123
|
-
)
|
|
125
|
+
from ...services.project.toolchain_analyzer import ToolchainAnalyzerService
|
|
124
126
|
|
|
125
127
|
# Initialize services with dependency injection
|
|
126
128
|
toolchain_analyzer = ToolchainAnalyzerService()
|
|
@@ -144,6 +146,15 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
144
146
|
|
|
145
147
|
return self._auto_config_manager
|
|
146
148
|
|
|
149
|
+
@property
|
|
150
|
+
def skills_deployer(self):
|
|
151
|
+
"""Get skills deployer instance (lazy loaded)."""
|
|
152
|
+
if self._skills_deployer is None:
|
|
153
|
+
from ...services.skills_deployer import SkillsDeployerService
|
|
154
|
+
|
|
155
|
+
self._skills_deployer = SkillsDeployerService()
|
|
156
|
+
return self._skills_deployer
|
|
157
|
+
|
|
147
158
|
def validate_args(self, args) -> Optional[str]:
|
|
148
159
|
"""Validate command arguments."""
|
|
149
160
|
# Validate project path
|
|
@@ -195,11 +206,26 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
195
206
|
skip_confirmation = args.yes if hasattr(args, "yes") and args.yes else False
|
|
196
207
|
json_output = args.json if hasattr(args, "json") and args.json else False
|
|
197
208
|
|
|
209
|
+
# Determine what to configure (agents, skills, or both)
|
|
210
|
+
configure_agents = not getattr(args, "skills_only", False)
|
|
211
|
+
configure_skills = not getattr(args, "agents_only", False)
|
|
212
|
+
|
|
198
213
|
# Run preview or full configuration
|
|
199
214
|
if dry_run or args.preview if hasattr(args, "preview") else False:
|
|
200
|
-
return self._run_preview(
|
|
215
|
+
return self._run_preview(
|
|
216
|
+
project_path,
|
|
217
|
+
min_confidence,
|
|
218
|
+
json_output,
|
|
219
|
+
configure_agents,
|
|
220
|
+
configure_skills,
|
|
221
|
+
)
|
|
201
222
|
return self._run_full_configuration(
|
|
202
|
-
project_path,
|
|
223
|
+
project_path,
|
|
224
|
+
min_confidence,
|
|
225
|
+
skip_confirmation,
|
|
226
|
+
json_output,
|
|
227
|
+
configure_agents,
|
|
228
|
+
configure_skills,
|
|
203
229
|
)
|
|
204
230
|
|
|
205
231
|
except KeyboardInterrupt:
|
|
@@ -219,24 +245,61 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
219
245
|
return CommandResult.error_result(error_msg)
|
|
220
246
|
|
|
221
247
|
def _run_preview(
|
|
222
|
-
self,
|
|
248
|
+
self,
|
|
249
|
+
project_path: Path,
|
|
250
|
+
min_confidence: float,
|
|
251
|
+
json_output: bool,
|
|
252
|
+
configure_agents: bool = True,
|
|
253
|
+
configure_skills: bool = True,
|
|
223
254
|
) -> CommandResult:
|
|
224
255
|
"""Run configuration preview without deploying."""
|
|
225
|
-
#
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
256
|
+
# Get agent preview
|
|
257
|
+
agent_preview = None
|
|
258
|
+
if configure_agents:
|
|
259
|
+
if self.console and not json_output:
|
|
260
|
+
with self.console.status("[bold green]Analyzing project toolchain..."):
|
|
261
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
262
|
+
project_path, min_confidence
|
|
263
|
+
)
|
|
264
|
+
else:
|
|
265
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
229
266
|
project_path, min_confidence
|
|
230
267
|
)
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
268
|
+
|
|
269
|
+
# Review existing project agents
|
|
270
|
+
agent_review_results = None
|
|
271
|
+
if configure_agents:
|
|
272
|
+
if self.console and not json_output:
|
|
273
|
+
with self.console.status("[bold green]Reviewing existing agents..."):
|
|
274
|
+
agent_review_results = self._review_project_agents(agent_preview)
|
|
275
|
+
else:
|
|
276
|
+
agent_review_results = self._review_project_agents(agent_preview)
|
|
277
|
+
|
|
278
|
+
# Get skills recommendations
|
|
279
|
+
skills_recommendations = None
|
|
280
|
+
if configure_skills:
|
|
281
|
+
if self.console and not json_output:
|
|
282
|
+
with self.console.status("[bold green]Analyzing skill requirements..."):
|
|
283
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
284
|
+
else:
|
|
285
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
235
286
|
|
|
236
287
|
# Output results
|
|
237
288
|
if json_output:
|
|
238
|
-
return self._output_preview_json(
|
|
239
|
-
|
|
289
|
+
return self._output_preview_json(
|
|
290
|
+
agent_preview,
|
|
291
|
+
skills_recommendations,
|
|
292
|
+
configure_agents,
|
|
293
|
+
configure_skills,
|
|
294
|
+
agent_review_results,
|
|
295
|
+
)
|
|
296
|
+
return self._display_preview(
|
|
297
|
+
agent_preview,
|
|
298
|
+
skills_recommendations,
|
|
299
|
+
configure_agents,
|
|
300
|
+
configure_skills,
|
|
301
|
+
agent_review_results,
|
|
302
|
+
)
|
|
240
303
|
|
|
241
304
|
def _run_full_configuration(
|
|
242
305
|
self,
|
|
@@ -244,147 +307,281 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
244
307
|
min_confidence: float,
|
|
245
308
|
skip_confirmation: bool,
|
|
246
309
|
json_output: bool,
|
|
310
|
+
configure_agents: bool = True,
|
|
311
|
+
configure_skills: bool = True,
|
|
247
312
|
) -> CommandResult:
|
|
248
313
|
"""Run full auto-configuration with deployment."""
|
|
249
|
-
# Get preview
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
314
|
+
# Get agent preview
|
|
315
|
+
agent_preview = None
|
|
316
|
+
if configure_agents:
|
|
317
|
+
if self.console and not json_output:
|
|
318
|
+
with self.console.status("[bold green]Analyzing project toolchain..."):
|
|
319
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
320
|
+
project_path, min_confidence
|
|
321
|
+
)
|
|
322
|
+
else:
|
|
323
|
+
agent_preview = self.auto_config_manager.preview_configuration(
|
|
253
324
|
project_path, min_confidence
|
|
254
325
|
)
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
326
|
+
|
|
327
|
+
# Review existing project agents
|
|
328
|
+
agent_review_results = None
|
|
329
|
+
if configure_agents:
|
|
330
|
+
if self.console and not json_output:
|
|
331
|
+
with self.console.status("[bold green]Reviewing existing agents..."):
|
|
332
|
+
agent_review_results = self._review_project_agents(agent_preview)
|
|
333
|
+
else:
|
|
334
|
+
agent_review_results = self._review_project_agents(agent_preview)
|
|
335
|
+
|
|
336
|
+
# Get skills recommendations
|
|
337
|
+
skills_recommendations = None
|
|
338
|
+
if configure_skills:
|
|
339
|
+
if self.console and not json_output:
|
|
340
|
+
with self.console.status("[bold green]Analyzing skill requirements..."):
|
|
341
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
342
|
+
else:
|
|
343
|
+
skills_recommendations = self._recommend_skills(agent_preview)
|
|
259
344
|
|
|
260
345
|
# Display preview (unless JSON output)
|
|
261
346
|
if not json_output:
|
|
262
|
-
self._display_preview(
|
|
347
|
+
self._display_preview(
|
|
348
|
+
agent_preview,
|
|
349
|
+
skills_recommendations,
|
|
350
|
+
configure_agents,
|
|
351
|
+
configure_skills,
|
|
352
|
+
agent_review_results,
|
|
353
|
+
)
|
|
263
354
|
|
|
264
355
|
# Ask for confirmation (unless skipped)
|
|
265
356
|
if not skip_confirmation and not json_output:
|
|
266
|
-
if not self._confirm_deployment(
|
|
357
|
+
if not self._confirm_deployment(
|
|
358
|
+
agent_preview,
|
|
359
|
+
skills_recommendations,
|
|
360
|
+
configure_agents,
|
|
361
|
+
configure_skills,
|
|
362
|
+
agent_review_results,
|
|
363
|
+
):
|
|
267
364
|
if self.console:
|
|
268
365
|
self.console.print("\n❌ Operation cancelled by user")
|
|
269
366
|
else:
|
|
270
367
|
print("\nOperation cancelled by user")
|
|
271
368
|
return CommandResult.error_result("Operation cancelled", exit_code=0)
|
|
272
369
|
|
|
273
|
-
#
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
370
|
+
# Archive unused agents (before deploying new ones)
|
|
371
|
+
archive_result = None
|
|
372
|
+
if configure_agents and agent_review_results:
|
|
373
|
+
agents_to_archive = agent_review_results.get("unused", [])
|
|
374
|
+
if agents_to_archive:
|
|
375
|
+
if self.console and not json_output:
|
|
376
|
+
self.console.print(
|
|
377
|
+
"\n[bold yellow]Archiving unused agents...[/bold yellow]\n"
|
|
378
|
+
)
|
|
379
|
+
archive_result = self._archive_agents(agents_to_archive)
|
|
380
|
+
|
|
381
|
+
# Execute agent configuration
|
|
382
|
+
agent_result = None
|
|
383
|
+
if configure_agents and agent_preview:
|
|
384
|
+
import asyncio
|
|
385
|
+
|
|
386
|
+
observer = RichProgressObserver(self.console) if self.console else None
|
|
387
|
+
agent_result = asyncio.run(
|
|
388
|
+
self.auto_config_manager.auto_configure(
|
|
389
|
+
project_path,
|
|
390
|
+
confirmation_required=False, # Already confirmed above
|
|
391
|
+
dry_run=False,
|
|
392
|
+
min_confidence=min_confidence,
|
|
393
|
+
observer=observer,
|
|
394
|
+
)
|
|
284
395
|
)
|
|
285
|
-
|
|
396
|
+
|
|
397
|
+
# Deploy skills
|
|
398
|
+
skills_result = None
|
|
399
|
+
if configure_skills and skills_recommendations:
|
|
400
|
+
if self.console and not json_output:
|
|
401
|
+
self.console.print("\n[bold cyan]Deploying skills...[/bold cyan]\n")
|
|
402
|
+
skills_result = self._deploy_skills(skills_recommendations)
|
|
286
403
|
|
|
287
404
|
# Output results
|
|
288
405
|
if json_output:
|
|
289
|
-
return self._output_result_json(
|
|
290
|
-
return self._display_result(
|
|
406
|
+
return self._output_result_json(agent_result, skills_result, archive_result)
|
|
407
|
+
return self._display_result(agent_result, skills_result, archive_result)
|
|
291
408
|
|
|
292
|
-
def _display_preview(
|
|
409
|
+
def _display_preview(
|
|
410
|
+
self,
|
|
411
|
+
agent_preview,
|
|
412
|
+
skills_recommendations=None,
|
|
413
|
+
configure_agents=True,
|
|
414
|
+
configure_skills=True,
|
|
415
|
+
agent_review_results=None,
|
|
416
|
+
) -> CommandResult:
|
|
293
417
|
"""Display configuration preview with Rich formatting."""
|
|
294
418
|
if not self.console:
|
|
295
419
|
# Fallback to plain text
|
|
296
|
-
return self._display_preview_plain(
|
|
420
|
+
return self._display_preview_plain(
|
|
421
|
+
agent_preview,
|
|
422
|
+
skills_recommendations,
|
|
423
|
+
configure_agents,
|
|
424
|
+
configure_skills,
|
|
425
|
+
agent_review_results,
|
|
426
|
+
)
|
|
297
427
|
|
|
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
|
-
)
|
|
428
|
+
# Only show toolchain and agents if configuring agents
|
|
429
|
+
if not configure_agents:
|
|
430
|
+
agent_preview = None
|
|
320
431
|
|
|
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(
|
|
432
|
+
# Display detected toolchain
|
|
433
|
+
if configure_agents and agent_preview:
|
|
434
|
+
self.console.print("\n📊 Detected Toolchain:", style="bold blue")
|
|
435
|
+
if (
|
|
436
|
+
agent_preview.detected_toolchain
|
|
437
|
+
and agent_preview.detected_toolchain.components
|
|
438
|
+
):
|
|
439
|
+
toolchain_table = Table(show_header=True, header_style="bold")
|
|
440
|
+
toolchain_table.add_column("Component", style="cyan")
|
|
441
|
+
toolchain_table.add_column("Version", style="yellow")
|
|
442
|
+
toolchain_table.add_column("Confidence", style="green")
|
|
443
|
+
|
|
444
|
+
for component in agent_preview.detected_toolchain.components:
|
|
445
|
+
confidence_pct = int(component.confidence * 100)
|
|
446
|
+
bar = "█" * (confidence_pct // 10) + "░" * (
|
|
447
|
+
10 - confidence_pct // 10
|
|
448
|
+
)
|
|
449
|
+
confidence_str = f"{bar} {confidence_pct}%"
|
|
450
|
+
|
|
451
|
+
toolchain_table.add_row(
|
|
452
|
+
(
|
|
453
|
+
component.type.value
|
|
454
|
+
if hasattr(component.type, "value")
|
|
455
|
+
else str(component.type)
|
|
456
|
+
),
|
|
457
|
+
component.version or "Unknown",
|
|
458
|
+
confidence_str,
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
self.console.print(toolchain_table)
|
|
462
|
+
else:
|
|
463
|
+
self.console.print(" No toolchain detected", style="yellow")
|
|
464
|
+
|
|
465
|
+
# Display recommended agents
|
|
466
|
+
self.console.print("\n🤖 Recommended Agents:", style="bold blue")
|
|
467
|
+
if agent_preview.recommendations:
|
|
468
|
+
for rec in agent_preview.recommendations:
|
|
469
|
+
confidence_pct = int(rec.confidence * 100)
|
|
470
|
+
icon = "✓" if rec.confidence >= 0.8 else "○"
|
|
471
|
+
self.console.print(
|
|
472
|
+
f" {icon} [bold]{rec.agent_id}[/bold] ({confidence_pct}% confidence)"
|
|
473
|
+
)
|
|
474
|
+
self.console.print(f" Reason: {rec.reasoning}", style="dim")
|
|
475
|
+
else:
|
|
476
|
+
self.console.print(" No agents recommended", style="yellow")
|
|
477
|
+
|
|
478
|
+
# Display validation issues
|
|
479
|
+
if (
|
|
480
|
+
agent_preview.validation_result
|
|
481
|
+
and agent_preview.validation_result.issues
|
|
482
|
+
):
|
|
483
|
+
self.console.print("\n⚠️ Validation Issues:", style="bold yellow")
|
|
484
|
+
for issue in agent_preview.validation_result.issues:
|
|
485
|
+
severity_icon = {"error": "❌", "warning": "⚠️", "info": "ℹ️"}.get(
|
|
486
|
+
(
|
|
487
|
+
issue.severity.value
|
|
488
|
+
if hasattr(issue.severity, "value")
|
|
489
|
+
else str(issue.severity)
|
|
490
|
+
),
|
|
491
|
+
"•",
|
|
492
|
+
)
|
|
493
|
+
self.console.print(
|
|
494
|
+
f" {severity_icon} {issue.message}", style="yellow"
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
# Display agent review results
|
|
498
|
+
if configure_agents and agent_review_results:
|
|
499
|
+
self._display_agent_review(agent_review_results)
|
|
500
|
+
|
|
501
|
+
# Display recommended skills
|
|
502
|
+
if configure_skills and skills_recommendations:
|
|
503
|
+
self.console.print("\n🎯 Recommended Skills:", style="bold blue")
|
|
504
|
+
for skill in skills_recommendations:
|
|
505
|
+
self.console.print(f" ✓ [bold]{skill}[/bold]")
|
|
351
506
|
|
|
352
507
|
return CommandResult.success_result()
|
|
353
508
|
|
|
354
|
-
def _display_preview_plain(
|
|
509
|
+
def _display_preview_plain(
|
|
510
|
+
self,
|
|
511
|
+
agent_preview,
|
|
512
|
+
skills_recommendations=None,
|
|
513
|
+
configure_agents=True,
|
|
514
|
+
configure_skills=True,
|
|
515
|
+
agent_review_results=None,
|
|
516
|
+
) -> CommandResult:
|
|
355
517
|
"""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
|
-
|
|
518
|
+
if configure_agents and agent_preview:
|
|
519
|
+
print("\nDetected Toolchain:")
|
|
520
|
+
if (
|
|
521
|
+
agent_preview.detected_toolchain
|
|
522
|
+
and agent_preview.detected_toolchain.components
|
|
523
|
+
):
|
|
524
|
+
for component in agent_preview.detected_toolchain.components:
|
|
525
|
+
confidence_pct = int(component.confidence * 100)
|
|
526
|
+
print(
|
|
527
|
+
f" - {component.type}: {component.version} ({confidence_pct}%)"
|
|
528
|
+
)
|
|
529
|
+
else:
|
|
530
|
+
print(" No toolchain detected")
|
|
531
|
+
|
|
532
|
+
print("\nRecommended Agents:")
|
|
533
|
+
if agent_preview.recommendations:
|
|
534
|
+
for rec in agent_preview.recommendations:
|
|
535
|
+
confidence_pct = int(rec.confidence * 100)
|
|
536
|
+
print(f" - {rec.agent_id} ({confidence_pct}%)")
|
|
537
|
+
print(f" Reason: {rec.reasoning}")
|
|
538
|
+
else:
|
|
539
|
+
print(" No agents recommended")
|
|
372
540
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
541
|
+
if (
|
|
542
|
+
agent_preview.validation_result
|
|
543
|
+
and agent_preview.validation_result.issues
|
|
544
|
+
):
|
|
545
|
+
print("\nValidation Issues:")
|
|
546
|
+
for issue in agent_preview.validation_result.issues:
|
|
547
|
+
print(f" - {issue.severity}: {issue.message}")
|
|
548
|
+
|
|
549
|
+
if configure_skills and skills_recommendations:
|
|
550
|
+
print("\nRecommended Skills:")
|
|
551
|
+
for skill in skills_recommendations:
|
|
552
|
+
print(f" - {skill}")
|
|
377
553
|
|
|
378
554
|
return CommandResult.success_result()
|
|
379
555
|
|
|
380
|
-
def _confirm_deployment(
|
|
556
|
+
def _confirm_deployment(
|
|
557
|
+
self,
|
|
558
|
+
agent_preview,
|
|
559
|
+
skills_recommendations=None,
|
|
560
|
+
configure_agents=True,
|
|
561
|
+
configure_skills=True,
|
|
562
|
+
agent_review_results=None,
|
|
563
|
+
) -> bool:
|
|
381
564
|
"""Ask user to confirm deployment."""
|
|
382
|
-
|
|
565
|
+
has_agents = (
|
|
566
|
+
configure_agents and agent_preview and agent_preview.recommendations
|
|
567
|
+
)
|
|
568
|
+
has_skills = configure_skills and skills_recommendations
|
|
569
|
+
|
|
570
|
+
if not has_agents and not has_skills:
|
|
383
571
|
return False
|
|
384
572
|
|
|
573
|
+
# Build confirmation message
|
|
574
|
+
items = []
|
|
575
|
+
if has_agents:
|
|
576
|
+
items.append(f"{len(agent_preview.recommendations)} agent(s)")
|
|
577
|
+
if has_skills:
|
|
578
|
+
items.append(f"{len(skills_recommendations)} skill(s)")
|
|
579
|
+
|
|
580
|
+
message = f"Deploy {' and '.join(items)}?"
|
|
581
|
+
|
|
385
582
|
if self.console:
|
|
386
583
|
self.console.print("\n" + "=" * 60)
|
|
387
|
-
self.console.print(
|
|
584
|
+
self.console.print(message, style="bold yellow")
|
|
388
585
|
self.console.print("=" * 60)
|
|
389
586
|
response = (
|
|
390
587
|
self.console.input("\n[bold]Proceed? (y/n/s for select):[/bold] ")
|
|
@@ -393,7 +590,7 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
393
590
|
)
|
|
394
591
|
else:
|
|
395
592
|
print("\n" + "=" * 60)
|
|
396
|
-
print(
|
|
593
|
+
print(message)
|
|
397
594
|
print("=" * 60)
|
|
398
595
|
response = input("\nProceed? (y/n/s for select): ").strip().lower()
|
|
399
596
|
|
|
@@ -411,160 +608,446 @@ class AutoConfigureCommand(BaseCommand):
|
|
|
411
608
|
return False
|
|
412
609
|
return False
|
|
413
610
|
|
|
414
|
-
def _display_result(
|
|
611
|
+
def _display_result(
|
|
612
|
+
self,
|
|
613
|
+
agent_result: Optional = None,
|
|
614
|
+
skills_result: Optional[dict] = None,
|
|
615
|
+
archive_result: Optional[dict] = None,
|
|
616
|
+
) -> CommandResult:
|
|
415
617
|
"""Display configuration result."""
|
|
416
618
|
if not self.console:
|
|
417
|
-
return self._display_result_plain(
|
|
418
|
-
|
|
419
|
-
# Display summary
|
|
420
|
-
if result.status == OperationResult.SUCCESS:
|
|
421
|
-
panel = Panel(
|
|
422
|
-
f"✅ Auto-configuration completed successfully!\n\n"
|
|
423
|
-
f"Deployed {len(result.deployed_agents)} agent(s)",
|
|
424
|
-
title="Success",
|
|
425
|
-
border_style="green",
|
|
619
|
+
return self._display_result_plain(
|
|
620
|
+
agent_result, skills_result, archive_result
|
|
426
621
|
)
|
|
427
|
-
self.console.print(panel)
|
|
428
622
|
|
|
623
|
+
# Determine overall success
|
|
624
|
+
agent_success = (
|
|
625
|
+
(agent_result and agent_result.status == OperationResult.SUCCESS)
|
|
626
|
+
if agent_result
|
|
627
|
+
else True
|
|
628
|
+
)
|
|
629
|
+
skills_success = not skills_result or (
|
|
630
|
+
skills_result and not skills_result.get("errors")
|
|
631
|
+
)
|
|
632
|
+
archive_success = not archive_result or not archive_result.get("errors")
|
|
633
|
+
overall_success = agent_success and skills_success and archive_success
|
|
634
|
+
|
|
635
|
+
# Display summary
|
|
636
|
+
if overall_success:
|
|
429
637
|
# Show deployed agents
|
|
430
|
-
if
|
|
638
|
+
if agent_result and agent_result.deployed_agents:
|
|
431
639
|
self.console.print("\n📦 Deployed Agents:", style="bold green")
|
|
432
|
-
for agent_id in
|
|
640
|
+
for agent_id in agent_result.deployed_agents:
|
|
433
641
|
self.console.print(f" ✓ {agent_id}")
|
|
434
642
|
|
|
643
|
+
# Show deployed skills
|
|
644
|
+
if skills_result and skills_result.get("deployed"):
|
|
645
|
+
self.console.print("\n🎯 Deployed Skills:", style="bold green")
|
|
646
|
+
for skill in skills_result["deployed"]:
|
|
647
|
+
self.console.print(f" ✓ {skill}")
|
|
648
|
+
|
|
649
|
+
# Show archived agents
|
|
650
|
+
if archive_result and archive_result.get("archived"):
|
|
651
|
+
self.console.print("\n📁 Archived Agents:", style="bold yellow")
|
|
652
|
+
for archived in archive_result["archived"]:
|
|
653
|
+
self.console.print(f" → {archived['name']}")
|
|
654
|
+
|
|
655
|
+
# Show restart notification
|
|
656
|
+
self._show_restart_notification(agent_result, skills_result, archive_result)
|
|
657
|
+
|
|
435
658
|
return CommandResult.success_result()
|
|
436
659
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
660
|
+
# Partial or complete failure
|
|
661
|
+
has_errors = False
|
|
662
|
+
if agent_result and agent_result.status in [
|
|
663
|
+
OperationResult.WARNING,
|
|
664
|
+
OperationResult.FAILED,
|
|
665
|
+
]:
|
|
666
|
+
has_errors = True
|
|
667
|
+
|
|
668
|
+
if agent_result.status == OperationResult.WARNING:
|
|
669
|
+
self.console.print(
|
|
670
|
+
"\n⚠️ Agent configuration partially completed", style="yellow"
|
|
671
|
+
)
|
|
672
|
+
else:
|
|
673
|
+
self.console.print("\n❌ Agent configuration failed", style="red")
|
|
446
674
|
|
|
447
|
-
if
|
|
675
|
+
if agent_result.failed_agents:
|
|
448
676
|
self.console.print("\n❌ Failed Agents:", style="bold red")
|
|
449
|
-
for agent_id in
|
|
450
|
-
error =
|
|
677
|
+
for agent_id in agent_result.failed_agents:
|
|
678
|
+
error = agent_result.errors.get(agent_id, "Unknown error")
|
|
451
679
|
self.console.print(f" ✗ {agent_id}: {error}")
|
|
452
680
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
681
|
+
if skills_result and skills_result.get("errors"):
|
|
682
|
+
has_errors = True
|
|
683
|
+
self.console.print("\n❌ Skill deployment failed", style="red")
|
|
684
|
+
for error in skills_result["errors"]:
|
|
685
|
+
self.console.print(f" ✗ {error}")
|
|
686
|
+
|
|
687
|
+
return (
|
|
688
|
+
CommandResult.error_result(
|
|
689
|
+
"Configuration partially succeeded"
|
|
690
|
+
if (agent_success or skills_success)
|
|
691
|
+
else "Configuration failed",
|
|
692
|
+
exit_code=1,
|
|
693
|
+
)
|
|
694
|
+
if has_errors
|
|
695
|
+
else CommandResult.success_result()
|
|
459
696
|
)
|
|
460
|
-
self.console.print(panel)
|
|
461
|
-
|
|
462
|
-
return CommandResult.error_result("Configuration failed", exit_code=1)
|
|
463
697
|
|
|
464
|
-
def _display_result_plain(
|
|
698
|
+
def _display_result_plain(
|
|
699
|
+
self,
|
|
700
|
+
agent_result: Optional = None,
|
|
701
|
+
skills_result: Optional[dict] = None,
|
|
702
|
+
archive_result: Optional[dict] = None,
|
|
703
|
+
) -> CommandResult:
|
|
465
704
|
"""Display result in plain text (fallback)."""
|
|
466
|
-
|
|
705
|
+
# Determine overall success
|
|
706
|
+
agent_success = (
|
|
707
|
+
(agent_result and agent_result.status == OperationResult.SUCCESS)
|
|
708
|
+
if agent_result
|
|
709
|
+
else True
|
|
710
|
+
)
|
|
711
|
+
skills_success = not skills_result or not skills_result.get("errors")
|
|
712
|
+
overall_success = agent_success and skills_success
|
|
713
|
+
|
|
714
|
+
if overall_success:
|
|
467
715
|
print("\n✅ Auto-configuration completed successfully!")
|
|
468
|
-
print(f"Deployed {len(result.deployed_agents)} agent(s)")
|
|
469
716
|
|
|
470
|
-
if
|
|
717
|
+
if agent_result and agent_result.deployed_agents:
|
|
718
|
+
print(f"Deployed {len(agent_result.deployed_agents)} agent(s)")
|
|
471
719
|
print("\nDeployed Agents:")
|
|
472
|
-
for agent_id in
|
|
720
|
+
for agent_id in agent_result.deployed_agents:
|
|
473
721
|
print(f" - {agent_id}")
|
|
474
722
|
|
|
723
|
+
if skills_result and skills_result.get("deployed"):
|
|
724
|
+
print(f"\nDeployed {len(skills_result['deployed'])} skill(s)")
|
|
725
|
+
print("\nDeployed Skills:")
|
|
726
|
+
for skill in skills_result["deployed"]:
|
|
727
|
+
print(f" - {skill}")
|
|
728
|
+
|
|
475
729
|
return CommandResult.success_result()
|
|
476
730
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
731
|
+
# Partial or complete failure
|
|
732
|
+
has_errors = False
|
|
733
|
+
if agent_result and agent_result.status in [
|
|
734
|
+
OperationResult.WARNING,
|
|
735
|
+
OperationResult.FAILED,
|
|
736
|
+
]:
|
|
737
|
+
has_errors = True
|
|
738
|
+
print(
|
|
739
|
+
"\n⚠️ Agent configuration partially completed"
|
|
740
|
+
if agent_result.status == OperationResult.WARNING
|
|
741
|
+
else "\n❌ Agent configuration failed"
|
|
742
|
+
)
|
|
481
743
|
|
|
482
|
-
if
|
|
744
|
+
if agent_result.failed_agents:
|
|
483
745
|
print("\nFailed Agents:")
|
|
484
|
-
for agent_id in
|
|
485
|
-
error =
|
|
746
|
+
for agent_id in agent_result.failed_agents:
|
|
747
|
+
error = agent_result.errors.get(agent_id, "Unknown error")
|
|
486
748
|
print(f" - {agent_id}: {error}")
|
|
487
749
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
750
|
+
if skills_result and skills_result.get("errors"):
|
|
751
|
+
has_errors = True
|
|
752
|
+
print("\n❌ Skill deployment failed")
|
|
753
|
+
for error in skills_result["errors"]:
|
|
754
|
+
print(f" - {error}")
|
|
755
|
+
|
|
756
|
+
return (
|
|
757
|
+
CommandResult.error_result(
|
|
758
|
+
"Configuration partially succeeded"
|
|
759
|
+
if (agent_success or skills_success)
|
|
760
|
+
else "Configuration failed",
|
|
761
|
+
exit_code=1,
|
|
762
|
+
)
|
|
763
|
+
if has_errors
|
|
764
|
+
else CommandResult.success_result()
|
|
765
|
+
)
|
|
494
766
|
|
|
495
|
-
def _output_preview_json(
|
|
767
|
+
def _output_preview_json(
|
|
768
|
+
self,
|
|
769
|
+
agent_preview,
|
|
770
|
+
skills_recommendations=None,
|
|
771
|
+
configure_agents=True,
|
|
772
|
+
configure_skills=True,
|
|
773
|
+
agent_review_results=None,
|
|
774
|
+
) -> CommandResult:
|
|
496
775
|
"""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
|
-
|
|
776
|
+
output = {}
|
|
777
|
+
|
|
778
|
+
if configure_agents and agent_preview:
|
|
779
|
+
output["agents"] = {
|
|
780
|
+
"detected_toolchain": {
|
|
781
|
+
"components": (
|
|
782
|
+
[
|
|
783
|
+
{
|
|
784
|
+
"type": (
|
|
785
|
+
c.type.value
|
|
786
|
+
if hasattr(c.type, "value")
|
|
787
|
+
else str(c.type)
|
|
788
|
+
),
|
|
789
|
+
"version": c.version,
|
|
790
|
+
"confidence": c.confidence,
|
|
791
|
+
}
|
|
792
|
+
for c in agent_preview.detected_toolchain.components
|
|
793
|
+
]
|
|
794
|
+
if agent_preview.detected_toolchain
|
|
795
|
+
else []
|
|
796
|
+
)
|
|
797
|
+
},
|
|
798
|
+
"recommendations": [
|
|
799
|
+
{
|
|
800
|
+
"agent_id": r.agent_id,
|
|
801
|
+
"confidence": r.confidence,
|
|
802
|
+
"reasoning": r.reasoning,
|
|
803
|
+
}
|
|
804
|
+
for r in agent_preview.recommendations
|
|
805
|
+
],
|
|
806
|
+
"validation": {
|
|
807
|
+
"is_valid": (
|
|
808
|
+
agent_preview.validation_result.is_valid
|
|
809
|
+
if agent_preview.validation_result
|
|
810
|
+
else True
|
|
811
|
+
),
|
|
812
|
+
"issues": (
|
|
813
|
+
[
|
|
814
|
+
{
|
|
815
|
+
"severity": (
|
|
816
|
+
i.severity.value
|
|
817
|
+
if hasattr(i.severity, "value")
|
|
818
|
+
else str(i.severity)
|
|
819
|
+
),
|
|
820
|
+
"message": i.message,
|
|
821
|
+
}
|
|
822
|
+
for i in agent_preview.validation_result.issues
|
|
823
|
+
]
|
|
824
|
+
if agent_preview.validation_result
|
|
825
|
+
else []
|
|
826
|
+
),
|
|
827
|
+
},
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
if configure_skills and skills_recommendations:
|
|
831
|
+
output["skills"] = {
|
|
832
|
+
"recommendations": skills_recommendations,
|
|
833
|
+
}
|
|
547
834
|
|
|
548
835
|
print(json.dumps(output, indent=2))
|
|
549
836
|
return CommandResult.success_result(data=output)
|
|
550
837
|
|
|
551
|
-
def _output_result_json(
|
|
838
|
+
def _output_result_json(
|
|
839
|
+
self,
|
|
840
|
+
agent_result: Optional = None,
|
|
841
|
+
skills_result: Optional[dict] = None,
|
|
842
|
+
archive_result: Optional[dict] = None,
|
|
843
|
+
) -> CommandResult:
|
|
552
844
|
"""Output result as JSON."""
|
|
553
|
-
output = {
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
845
|
+
output = {}
|
|
846
|
+
|
|
847
|
+
if agent_result:
|
|
848
|
+
output["agents"] = {
|
|
849
|
+
"status": (
|
|
850
|
+
agent_result.status.value
|
|
851
|
+
if hasattr(agent_result.status, "value")
|
|
852
|
+
else str(agent_result.status)
|
|
853
|
+
),
|
|
854
|
+
"deployed_agents": agent_result.deployed_agents,
|
|
855
|
+
"failed_agents": agent_result.failed_agents,
|
|
856
|
+
"errors": agent_result.errors,
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
if skills_result:
|
|
860
|
+
output["skills"] = skills_result
|
|
563
861
|
|
|
564
862
|
print(json.dumps(output, indent=2))
|
|
565
863
|
|
|
566
|
-
|
|
864
|
+
# Determine overall success
|
|
865
|
+
agent_success = (
|
|
866
|
+
agent_result.status == OperationResult.SUCCESS if agent_result else True
|
|
867
|
+
)
|
|
868
|
+
skills_success = not skills_result or not skills_result.get("errors")
|
|
869
|
+
overall_success = agent_success and skills_success
|
|
870
|
+
|
|
871
|
+
if overall_success:
|
|
567
872
|
return CommandResult.success_result(data=output)
|
|
568
873
|
return CommandResult.error_result(
|
|
569
874
|
"Configuration failed or partial", exit_code=1, data=output
|
|
570
875
|
)
|
|
876
|
+
|
|
877
|
+
def _recommend_skills(self, agent_preview):
|
|
878
|
+
"""Recommend skills based on deployed/recommended agents.
|
|
879
|
+
|
|
880
|
+
Args:
|
|
881
|
+
agent_preview: Agent preview result with recommendations
|
|
882
|
+
|
|
883
|
+
Returns:
|
|
884
|
+
List of recommended skill names, or None if no agents recommended
|
|
885
|
+
"""
|
|
886
|
+
if not agent_preview or not agent_preview.recommendations:
|
|
887
|
+
return None
|
|
888
|
+
|
|
889
|
+
# Import agent-skill mapping
|
|
890
|
+
from ...cli.interactive.skills_wizard import AGENT_SKILL_MAPPING
|
|
891
|
+
|
|
892
|
+
# Collect recommended skills based on agent types
|
|
893
|
+
recommended_skills = set()
|
|
894
|
+
for rec in agent_preview.recommendations:
|
|
895
|
+
agent_id = rec.agent_id
|
|
896
|
+
# Map agent ID to skill recommendations
|
|
897
|
+
if agent_id in AGENT_SKILL_MAPPING:
|
|
898
|
+
recommended_skills.update(AGENT_SKILL_MAPPING[agent_id])
|
|
899
|
+
|
|
900
|
+
return list(recommended_skills) if recommended_skills else None
|
|
901
|
+
|
|
902
|
+
def _deploy_skills(self, recommended_skills: list[str]) -> dict:
|
|
903
|
+
"""Deploy recommended skills.
|
|
904
|
+
|
|
905
|
+
Args:
|
|
906
|
+
recommended_skills: List of skill names to deploy
|
|
907
|
+
|
|
908
|
+
Returns:
|
|
909
|
+
Dict with deployment results: {"deployed": [...], "errors": [...]}
|
|
910
|
+
"""
|
|
911
|
+
try:
|
|
912
|
+
return self.skills_deployer.deploy_skills(
|
|
913
|
+
skill_names=recommended_skills, force=False
|
|
914
|
+
)
|
|
915
|
+
except Exception as e:
|
|
916
|
+
self.logger.error(f"Failed to deploy skills: {e}")
|
|
917
|
+
return {"deployed": [], "errors": [str(e)]}
|
|
918
|
+
|
|
919
|
+
def _review_project_agents(self, agent_preview) -> Optional[dict]:
|
|
920
|
+
"""Review existing project agents and categorize them.
|
|
921
|
+
|
|
922
|
+
Args:
|
|
923
|
+
agent_preview: Agent preview result with recommendations
|
|
924
|
+
|
|
925
|
+
Returns:
|
|
926
|
+
Dictionary with categorized agents or None if no preview
|
|
927
|
+
"""
|
|
928
|
+
if not agent_preview:
|
|
929
|
+
return None
|
|
930
|
+
|
|
931
|
+
from ...services.agents.agent_review_service import AgentReviewService
|
|
932
|
+
from ...services.agents.deployment.remote_agent_discovery_service import (
|
|
933
|
+
RemoteAgentDiscoveryService,
|
|
934
|
+
)
|
|
935
|
+
|
|
936
|
+
# Get managed agents from cache
|
|
937
|
+
agents_cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
938
|
+
if not agents_cache_dir.exists():
|
|
939
|
+
self.logger.debug("No agents cache found")
|
|
940
|
+
return None
|
|
941
|
+
|
|
942
|
+
# Discover managed agents
|
|
943
|
+
discovery_service = RemoteAgentDiscoveryService(agents_cache_dir)
|
|
944
|
+
managed_agents = discovery_service.discover_remote_agents()
|
|
945
|
+
|
|
946
|
+
if not managed_agents:
|
|
947
|
+
self.logger.debug("No managed agents found in cache")
|
|
948
|
+
return None
|
|
949
|
+
|
|
950
|
+
# Get recommended agent IDs
|
|
951
|
+
recommended_ids = set()
|
|
952
|
+
if agent_preview.recommendations:
|
|
953
|
+
recommended_ids = {rec.agent_id for rec in agent_preview.recommendations}
|
|
954
|
+
|
|
955
|
+
# Review project agents
|
|
956
|
+
project_agents_dir = Path.cwd() / ".claude" / "agents"
|
|
957
|
+
review_service = AgentReviewService()
|
|
958
|
+
return review_service.review_project_agents(
|
|
959
|
+
project_agents_dir, managed_agents, recommended_ids
|
|
960
|
+
)
|
|
961
|
+
|
|
962
|
+
def _archive_agents(self, agents_to_archive: list[dict]) -> dict:
|
|
963
|
+
"""Archive unused agents by moving them to .claude/agents/unused/.
|
|
964
|
+
|
|
965
|
+
Args:
|
|
966
|
+
agents_to_archive: List of agent dicts to archive
|
|
967
|
+
|
|
968
|
+
Returns:
|
|
969
|
+
Dictionary with archival results
|
|
970
|
+
"""
|
|
971
|
+
from ...services.agents.agent_review_service import AgentReviewService
|
|
972
|
+
|
|
973
|
+
project_agents_dir = Path.cwd() / ".claude" / "agents"
|
|
974
|
+
review_service = AgentReviewService()
|
|
975
|
+
return review_service.archive_agents(agents_to_archive, project_agents_dir)
|
|
976
|
+
|
|
977
|
+
def _display_agent_review(self, review_results: dict) -> None:
|
|
978
|
+
"""Display agent review results in the preview.
|
|
979
|
+
|
|
980
|
+
Args:
|
|
981
|
+
review_results: Dictionary with categorized agents
|
|
982
|
+
"""
|
|
983
|
+
if not self.console:
|
|
984
|
+
return
|
|
985
|
+
|
|
986
|
+
# Count agents to archive
|
|
987
|
+
unused_count = len(review_results.get("unused", []))
|
|
988
|
+
outdated_count = len(review_results.get("outdated", []))
|
|
989
|
+
custom_count = len(review_results.get("custom", []))
|
|
990
|
+
|
|
991
|
+
if unused_count > 0 or outdated_count > 0 or custom_count > 0:
|
|
992
|
+
self.console.print("\n📋 Existing Agents Review:", style="bold blue")
|
|
993
|
+
|
|
994
|
+
# Show custom agents (will be preserved)
|
|
995
|
+
if custom_count > 0:
|
|
996
|
+
self.console.print(
|
|
997
|
+
"\n [green]Custom agents (will be preserved):[/green]"
|
|
998
|
+
)
|
|
999
|
+
for agent in review_results["custom"]:
|
|
1000
|
+
self.console.print(f" ✓ {agent['name']} (v{agent['version']})")
|
|
1001
|
+
|
|
1002
|
+
# Show agents to be archived
|
|
1003
|
+
if unused_count > 0:
|
|
1004
|
+
self.console.print(
|
|
1005
|
+
"\n [yellow]Agents to archive (not needed for this toolchain):[/yellow]"
|
|
1006
|
+
)
|
|
1007
|
+
for agent in review_results["unused"]:
|
|
1008
|
+
reason = (
|
|
1009
|
+
f"outdated (v{agent['current_version']} → v{agent['available_version']})"
|
|
1010
|
+
if "current_version" in agent
|
|
1011
|
+
else "not recommended"
|
|
1012
|
+
)
|
|
1013
|
+
self.console.print(f" → {agent['name']} ({reason})")
|
|
1014
|
+
self.console.print(
|
|
1015
|
+
" [dim]Will be moved to .claude/agents/unused/[/dim]"
|
|
1016
|
+
)
|
|
1017
|
+
|
|
1018
|
+
def _show_restart_notification(
|
|
1019
|
+
self, agent_result=None, skills_result=None, archive_result=None
|
|
1020
|
+
) -> None:
|
|
1021
|
+
"""Show restart notification after configuration is complete.
|
|
1022
|
+
|
|
1023
|
+
Args:
|
|
1024
|
+
agent_result: Agent deployment results
|
|
1025
|
+
skills_result: Skills deployment results
|
|
1026
|
+
archive_result: Agent archival results
|
|
1027
|
+
"""
|
|
1028
|
+
if not self.console:
|
|
1029
|
+
return
|
|
1030
|
+
|
|
1031
|
+
# Build summary of changes
|
|
1032
|
+
changes = []
|
|
1033
|
+
if agent_result and agent_result.deployed_agents:
|
|
1034
|
+
changes.append(f"Deployed {len(agent_result.deployed_agents)} agent(s)")
|
|
1035
|
+
if skills_result and skills_result.get("deployed"):
|
|
1036
|
+
changes.append(f"Deployed {len(skills_result['deployed'])} skill(s)")
|
|
1037
|
+
if archive_result and archive_result.get("archived"):
|
|
1038
|
+
changes.append(
|
|
1039
|
+
f"Archived {len(archive_result['archived'])} unused agent(s) to .claude/agents/unused/"
|
|
1040
|
+
)
|
|
1041
|
+
|
|
1042
|
+
if changes:
|
|
1043
|
+
self.console.print("\n" + "=" * 70)
|
|
1044
|
+
self.console.print("✅ [bold green]Configuration complete![/bold green]")
|
|
1045
|
+
self.console.print(
|
|
1046
|
+
"\n🔄 [bold yellow]Please restart Claude Code to apply changes:[/bold yellow]"
|
|
1047
|
+
)
|
|
1048
|
+
self.console.print(" - Quit Claude Code completely")
|
|
1049
|
+
self.console.print(" - Relaunch Claude Code")
|
|
1050
|
+
self.console.print("\n[bold]Changes applied:[/bold]")
|
|
1051
|
+
for change in changes:
|
|
1052
|
+
self.console.print(f" • {change}")
|
|
1053
|
+
self.console.print("=" * 70 + "\n")
|