claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (520) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +35 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +37 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +924 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  41. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  42. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  44. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  46. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  47. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  48. claude_mpm/cli/commands/postmortem.py +401 -0
  49. claude_mpm/cli/commands/run.py +125 -167
  50. claude_mpm/cli/commands/skill_source.py +694 -0
  51. claude_mpm/cli/commands/skills.py +835 -44
  52. claude_mpm/cli/executor.py +78 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +256 -4
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  57. claude_mpm/cli/parsers/base_parser.py +53 -0
  58. claude_mpm/cli/parsers/config_parser.py +96 -43
  59. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +145 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +564 -108
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  68. claude_mpm/commands/mpm-agents-detect.md +9 -0
  69. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  70. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  71. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  72. claude_mpm/commands/mpm-doctor.md +9 -0
  73. claude_mpm/commands/mpm-help.md +17 -2
  74. claude_mpm/commands/mpm-init.md +28 -3
  75. claude_mpm/commands/mpm-monitor.md +9 -0
  76. claude_mpm/commands/mpm-postmortem.md +123 -0
  77. claude_mpm/commands/mpm-session-resume.md +381 -0
  78. claude_mpm/commands/mpm-status.md +9 -0
  79. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  80. claude_mpm/commands/mpm-ticket-view.md +552 -0
  81. claude_mpm/commands/mpm-version.md +9 -0
  82. claude_mpm/commands/mpm.md +11 -0
  83. claude_mpm/config/agent_presets.py +488 -0
  84. claude_mpm/config/agent_sources.py +325 -0
  85. claude_mpm/config/skill_presets.py +392 -0
  86. claude_mpm/config/skill_sources.py +590 -0
  87. claude_mpm/constants.py +13 -0
  88. claude_mpm/core/api_validator.py +1 -1
  89. claude_mpm/core/claude_runner.py +19 -35
  90. claude_mpm/core/config.py +24 -0
  91. claude_mpm/core/constants.py +1 -1
  92. claude_mpm/core/framework/__init__.py +3 -16
  93. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  94. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  95. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  96. claude_mpm/core/hook_error_memory.py +381 -0
  97. claude_mpm/core/hook_manager.py +41 -2
  98. claude_mpm/core/interactive_session.py +131 -10
  99. claude_mpm/core/interfaces.py +56 -1
  100. claude_mpm/core/logger.py +3 -1
  101. claude_mpm/core/oneshot_session.py +110 -8
  102. claude_mpm/core/protocols/__init__.py +23 -0
  103. claude_mpm/core/protocols/runner_protocol.py +103 -0
  104. claude_mpm/core/protocols/session_protocol.py +131 -0
  105. claude_mpm/core/shared/singleton_manager.py +11 -4
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_config.py +22 -0
  108. claude_mpm/dashboard/static/css/activity.css +69 -69
  109. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  110. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  111. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  112. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  114. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  117. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  119. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  120. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  121. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  122. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  123. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  124. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  125. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  126. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  127. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  128. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  129. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  130. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  131. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  132. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  133. claude_mpm/dashboard/templates/code_simple.html +23 -23
  134. claude_mpm/dashboard/templates/index.html +18 -18
  135. claude_mpm/experimental/cli_enhancements.py +1 -5
  136. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  143. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  144. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  145. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  152. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  153. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  154. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  155. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  156. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  157. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  158. claude_mpm/models/git_repository.py +198 -0
  159. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +45 -9
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_selection_service.py +484 -0
  164. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  165. claude_mpm/services/agents/cache_git_manager.py +621 -0
  166. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  167. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  168. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  169. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  170. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  171. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  172. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  173. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  174. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  175. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  176. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  177. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  178. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  179. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  180. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  181. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  182. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  183. claude_mpm/services/agents/git_source_manager.py +629 -0
  184. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  185. claude_mpm/services/agents/local_template_manager.py +50 -10
  186. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  187. claude_mpm/services/agents/sources/__init__.py +13 -0
  188. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  189. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  190. claude_mpm/services/agents/startup_sync.py +239 -0
  191. claude_mpm/services/agents/toolchain_detector.py +474 -0
  192. claude_mpm/services/analysis/__init__.py +25 -0
  193. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  194. claude_mpm/services/analysis/postmortem_service.py +765 -0
  195. claude_mpm/services/cli/session_pause_manager.py +504 -0
  196. claude_mpm/services/cli/session_resume_helper.py +36 -16
  197. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  198. claude_mpm/services/command_deployment_service.py +200 -6
  199. claude_mpm/services/core/base.py +31 -11
  200. claude_mpm/services/core/interfaces/__init__.py +1 -3
  201. claude_mpm/services/core/interfaces/health.py +1 -4
  202. claude_mpm/services/core/interfaces.py +56 -1
  203. claude_mpm/services/core/models/__init__.py +2 -11
  204. claude_mpm/services/core/models/agent_config.py +3 -0
  205. claude_mpm/services/core/models/process.py +4 -0
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/diagnostics/models.py +21 -0
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/event_bus/event_bus.py +36 -3
  219. claude_mpm/services/event_bus/relay.py +23 -7
  220. claude_mpm/services/events/consumers/logging.py +1 -2
  221. claude_mpm/services/git/__init__.py +21 -0
  222. claude_mpm/services/git/git_operations_service.py +494 -0
  223. claude_mpm/services/github/__init__.py +21 -0
  224. claude_mpm/services/github/github_cli_service.py +397 -0
  225. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  226. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  227. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  228. claude_mpm/services/instructions/__init__.py +9 -0
  229. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  230. claude_mpm/services/local_ops/__init__.py +5 -13
  231. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  232. claude_mpm/services/local_ops/health_manager.py +1 -4
  233. claude_mpm/services/local_ops/process_manager.py +1 -1
  234. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  235. claude_mpm/services/mcp_config_manager.py +75 -145
  236. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  237. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
  239. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  240. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  241. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  242. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  243. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  244. claude_mpm/services/mcp_service_verifier.py +6 -3
  245. claude_mpm/services/memory/failure_tracker.py +19 -4
  246. claude_mpm/services/memory/optimizer.py +1 -1
  247. claude_mpm/services/model/model_router.py +8 -9
  248. claude_mpm/services/monitor/daemon.py +29 -9
  249. claude_mpm/services/monitor/daemon_manager.py +96 -19
  250. claude_mpm/services/monitor/server.py +2 -2
  251. claude_mpm/services/native_agent_converter.py +356 -0
  252. claude_mpm/services/port_manager.py +1 -1
  253. claude_mpm/services/pr/__init__.py +14 -0
  254. claude_mpm/services/pr/pr_template_service.py +329 -0
  255. claude_mpm/services/project/documentation_manager.py +2 -1
  256. claude_mpm/services/project/project_organizer.py +4 -0
  257. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  258. claude_mpm/services/runner_configuration_service.py +17 -3
  259. claude_mpm/services/self_upgrade_service.py +165 -7
  260. claude_mpm/services/session_management_service.py +16 -4
  261. claude_mpm/services/skills/__init__.py +18 -0
  262. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  263. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  264. claude_mpm/services/skills_config.py +547 -0
  265. claude_mpm/services/skills_deployer.py +955 -0
  266. claude_mpm/services/socketio/handlers/connection.py +1 -1
  267. claude_mpm/services/socketio/handlers/git.py +2 -2
  268. claude_mpm/services/socketio/server/core.py +1 -4
  269. claude_mpm/services/socketio/server/main.py +1 -3
  270. claude_mpm/services/system_instructions_service.py +1 -3
  271. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  272. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  273. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  274. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  275. claude_mpm/services/unified/unified_deployment.py +1 -5
  276. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  277. claude_mpm/services/visualization/__init__.py +1 -5
  278. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  279. claude_mpm/skills/__init__.py +3 -3
  280. claude_mpm/skills/agent_skills_injector.py +42 -49
  281. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  282. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  283. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  284. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  285. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  286. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  287. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  288. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  289. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  290. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  291. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  292. claude_mpm/skills/skills_registry.py +44 -48
  293. claude_mpm/skills/skills_service.py +117 -108
  294. claude_mpm/templates/questions/__init__.py +38 -0
  295. claude_mpm/templates/questions/base.py +193 -0
  296. claude_mpm/templates/questions/pr_strategy.py +311 -0
  297. claude_mpm/templates/questions/project_init.py +385 -0
  298. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  299. claude_mpm/tools/__main__.py +8 -8
  300. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  301. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  302. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  303. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  304. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  305. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  306. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  307. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  308. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  309. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  310. claude_mpm/utils/agent_dependency_loader.py +80 -13
  311. claude_mpm/utils/agent_filters.py +288 -0
  312. claude_mpm/utils/dependency_cache.py +3 -1
  313. claude_mpm/utils/gitignore.py +244 -0
  314. claude_mpm/utils/log_cleanup.py +3 -3
  315. claude_mpm/utils/migration.py +372 -0
  316. claude_mpm/utils/progress.py +387 -0
  317. claude_mpm/utils/robust_installer.py +3 -5
  318. claude_mpm/utils/structured_questions.py +619 -0
  319. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
  320. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
  321. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  322. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  323. claude_mpm/agents/templates/agent-manager.json +0 -273
  324. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  325. claude_mpm/agents/templates/api_qa.json +0 -180
  326. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  327. claude_mpm/agents/templates/clerk-ops.json +0 -235
  328. claude_mpm/agents/templates/code_analyzer.json +0 -101
  329. claude_mpm/agents/templates/content-agent.json +0 -358
  330. claude_mpm/agents/templates/dart_engineer.json +0 -307
  331. claude_mpm/agents/templates/data_engineer.json +0 -225
  332. claude_mpm/agents/templates/documentation.json +0 -211
  333. claude_mpm/agents/templates/engineer.json +0 -210
  334. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  335. claude_mpm/agents/templates/golang_engineer.json +0 -270
  336. claude_mpm/agents/templates/imagemagick.json +0 -264
  337. claude_mpm/agents/templates/java_engineer.json +0 -346
  338. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  339. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  340. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  341. claude_mpm/agents/templates/memory_manager.json +0 -158
  342. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  343. claude_mpm/agents/templates/ops.json +0 -185
  344. claude_mpm/agents/templates/php-engineer.json +0 -281
  345. claude_mpm/agents/templates/product_owner.json +0 -338
  346. claude_mpm/agents/templates/project_organizer.json +0 -140
  347. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  348. claude_mpm/agents/templates/python_engineer.json +0 -387
  349. claude_mpm/agents/templates/qa.json +0 -242
  350. claude_mpm/agents/templates/react_engineer.json +0 -238
  351. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  352. claude_mpm/agents/templates/research.json +0 -188
  353. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  354. claude_mpm/agents/templates/rust_engineer.json +0 -275
  355. claude_mpm/agents/templates/security.json +0 -202
  356. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  357. claude_mpm/agents/templates/ticketing.json +0 -177
  358. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  359. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  360. claude_mpm/agents/templates/version_control.json +0 -157
  361. claude_mpm/agents/templates/web_qa.json +0 -399
  362. claude_mpm/agents/templates/web_ui.json +0 -189
  363. claude_mpm/cli/commands/mpm_init.py +0 -2093
  364. claude_mpm/commands/mpm-tickets.md +0 -102
  365. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  366. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  367. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  368. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  369. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  370. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  371. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  372. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  373. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  374. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  375. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  376. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  377. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  378. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  379. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  380. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  381. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  382. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  383. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  384. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  385. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  386. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  387. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  388. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  389. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  390. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  391. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  392. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  393. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  394. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  395. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  396. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  397. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  398. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  399. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  400. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  402. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  403. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  404. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  405. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  406. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  407. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  408. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  409. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  410. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  411. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  412. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  413. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  414. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  415. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  416. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  417. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  418. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  419. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  420. claude_mpm/dashboard/static/built/react/events.js +0 -30
  421. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  422. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  423. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  424. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  425. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  426. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  427. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  428. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  429. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  430. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  444. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  445. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  446. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  447. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  448. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  449. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  450. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  451. claude_mpm/dashboard/static/events.html +0 -607
  452. claude_mpm/dashboard/static/index.html +0 -635
  453. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  454. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  455. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  456. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  457. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  458. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  459. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  460. claude_mpm/dashboard/static/legacy/files.html +0 -747
  461. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  462. claude_mpm/dashboard/static/monitors.html +0 -431
  463. claude_mpm/dashboard/static/production/events.html +0 -659
  464. claude_mpm/dashboard/static/production/main.html +0 -698
  465. claude_mpm/dashboard/static/production/monitors.html +0 -483
  466. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  467. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  468. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  469. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  470. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  471. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
  472. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
  473. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
  474. claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
  475. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
  476. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
  477. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  478. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  479. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  480. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  481. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  482. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  483. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  484. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  485. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  486. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  487. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
  488. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  489. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
  490. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
  491. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
  492. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
  493. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  494. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  495. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  496. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  497. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
  498. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  499. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  500. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  501. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  502. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
  503. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
  504. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  505. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  506. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  507. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  508. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  509. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  510. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
  511. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
  512. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  513. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  514. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  515. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  516. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  517. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  518. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  519. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  520. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.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 detected toolchain.
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(project_path, min_confidence, json_output)
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, min_confidence, skip_confirmation, json_output
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, project_path: Path, min_confidence: float, json_output: bool
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
- # Show analysis spinner
226
- if self.console and not json_output:
227
- with self.console.status("[bold green]Analyzing project toolchain..."):
228
- preview = self.auto_config_manager.preview_configuration(
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
- else:
232
- preview = self.auto_config_manager.preview_configuration(
233
- project_path, min_confidence
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(preview)
239
- return self._display_preview(preview)
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 first
250
- if self.console and not json_output:
251
- with self.console.status("[bold green]Analyzing project toolchain..."):
252
- preview = self.auto_config_manager.preview_configuration(
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
- else:
256
- preview = self.auto_config_manager.preview_configuration(
257
- project_path, min_confidence
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(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(preview):
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
- import asyncio
275
-
276
- observer = RichProgressObserver(self.console) if self.console else None
277
- result = asyncio.run(
278
- self.auto_config_manager.auto_configure(
279
- project_path,
280
- confirmation_required=False, # Already confirmed above
281
- dry_run=False,
282
- min_confidence=min_confidence,
283
- observer=observer,
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(result)
290
- return self._display_result(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(self, preview) -> CommandResult:
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(preview)
384
+ return self._display_preview_plain(
385
+ agent_preview,
386
+ skills_recommendations,
387
+ configure_agents,
388
+ configure_skills,
389
+ )
297
390
 
298
- # Display detected toolchain
299
- self.console.print("\n📊 Detected Toolchain:", style="bold blue")
300
- if preview.detected_toolchain and preview.detected_toolchain.components:
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
- self.console.print(toolchain_table)
322
- else:
323
- self.console.print(" No toolchain detected", style="yellow")
324
-
325
- # Display recommended agents
326
- self.console.print("\n🤖 Recommended Agents:", style="bold blue")
327
- if preview.recommendations:
328
- for rec in preview.recommendations:
329
- confidence_pct = int(rec.confidence * 100)
330
- icon = "" if rec.confidence >= 0.8 else ""
331
- self.console.print(
332
- f" {icon} [bold]{rec.agent_id}[/bold] ({confidence_pct}% confidence)"
333
- )
334
- self.console.print(f" Reason: {rec.reasoning}", style="dim")
335
- else:
336
- self.console.print(" No agents recommended", style="yellow")
337
-
338
- # Display validation issues
339
- if preview.validation_result and preview.validation_result.issues:
340
- self.console.print("\n⚠️ Validation Issues:", style="bold yellow")
341
- for issue in preview.validation_result.issues:
342
- severity_icon = {"error": "❌", "warning": "⚠️", "info": "ℹ️"}.get(
343
- (
344
- issue.severity.value
345
- if hasattr(issue.severity, "value")
346
- else str(issue.severity)
347
- ),
348
- "•",
349
- )
350
- self.console.print(f" {severity_icon} {issue.message}", style="yellow")
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(self, preview) -> CommandResult:
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
- print("\nDetected Toolchain:")
357
- if preview.detected_toolchain and preview.detected_toolchain.components:
358
- for component in preview.detected_toolchain.components:
359
- confidence_pct = int(component.confidence * 100)
360
- print(f" - {component.type}: {component.version} ({confidence_pct}%)")
361
- else:
362
- print(" No toolchain detected")
363
-
364
- print("\nRecommended Agents:")
365
- if preview.recommendations:
366
- for rec in preview.recommendations:
367
- confidence_pct = int(rec.confidence * 100)
368
- print(f" - {rec.agent_id} ({confidence_pct}%)")
369
- print(f" Reason: {rec.reasoning}")
370
- else:
371
- print(" No agents recommended")
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 preview.validation_result and preview.validation_result.issues:
374
- print("\nValidation Issues:")
375
- for issue in preview.validation_result.issues:
376
- print(f" - {issue.severity}: {issue.message}")
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(self, preview) -> bool:
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
- if not preview.recommendations:
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("Deploy these agents?", style="bold yellow")
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("Deploy these agents?")
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(self, result: ConfigurationResult) -> CommandResult:
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(result)
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 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",
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 result.deployed_agents:
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 result.deployed_agents:
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
- if result.status == OperationResult.WARNING:
438
- panel = Panel(
439
- f"⚠️ Auto-configuration partially completed\n\n"
440
- f"Deployed: {len(result.deployed_agents)}\n"
441
- f"Failed: {len(result.failed_agents)}",
442
- title="Partial Success",
443
- border_style="yellow",
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 result.failed_agents:
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 result.failed_agents:
450
- error = result.errors.get(agent_id, "Unknown 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
- return CommandResult.error_result("Partial configuration", exit_code=1)
454
-
455
- panel = Panel(
456
- f"❌ Auto-configuration failed\n\n{result.errors.get('general', 'Unknown error')}",
457
- title="Error",
458
- border_style="red",
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(self, result: ConfigurationResult) -> CommandResult:
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
- if result.status == OperationResult.SUCCESS:
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 result.deployed_agents:
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 result.deployed_agents:
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
- if result.status == OperationResult.WARNING:
478
- print("\n⚠️ Auto-configuration partially completed")
479
- print(f"Deployed: {len(result.deployed_agents)}")
480
- print(f"Failed: {len(result.failed_agents)}")
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 result.failed_agents:
699
+ if agent_result.failed_agents:
483
700
  print("\nFailed Agents:")
484
- for agent_id in result.failed_agents:
485
- error = result.errors.get(agent_id, "Unknown 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
- return CommandResult.error_result("Partial configuration", exit_code=1)
489
-
490
- print("\n❌ Auto-configuration failed")
491
- print(result.errors.get("general", "Unknown error"))
492
-
493
- return CommandResult.error_result("Configuration failed", exit_code=1)
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(self, preview) -> CommandResult:
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
- "detected_toolchain": {
499
- "components": (
500
- [
501
- {
502
- "type": (
503
- c.type.value
504
- if hasattr(c.type, "value")
505
- else str(c.type)
506
- ),
507
- "version": c.version,
508
- "confidence": c.confidence,
509
- }
510
- for c in preview.detected_toolchain.components
511
- ]
512
- if preview.detected_toolchain
513
- else []
514
- )
515
- },
516
- "recommendations": [
517
- {
518
- "agent_id": r.agent_id,
519
- "confidence": r.confidence,
520
- "reasoning": r.reasoning,
521
- }
522
- for r in preview.recommendations
523
- ],
524
- "validation": {
525
- "is_valid": (
526
- preview.validation_result.is_valid
527
- if preview.validation_result
528
- else True
529
- ),
530
- "issues": (
531
- [
532
- {
533
- "severity": (
534
- i.severity.value
535
- if hasattr(i.severity, "value")
536
- else str(i.severity)
537
- ),
538
- "message": i.message,
539
- }
540
- for i in preview.validation_result.issues
541
- ]
542
- if preview.validation_result
543
- else []
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(self, result: ConfigurationResult) -> CommandResult:
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
- "status": (
555
- result.status.value
556
- if hasattr(result.status, "value")
557
- else str(result.status)
558
- ),
559
- "deployed_agents": result.deployed_agents,
560
- "failed_agents": result.failed_agents,
561
- "errors": result.errors,
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
- if result.status == OperationResult.SUCCESS:
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)]}