claude-mpm 4.21.3__py3-none-any.whl → 5.1.9__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (517) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
  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 +69 -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 +1128 -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 +935 -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/core.py +50 -2
  41. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  42. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  43. claude_mpm/cli/commands/postmortem.py +401 -0
  44. claude_mpm/cli/commands/run.py +125 -167
  45. claude_mpm/cli/commands/skill_source.py +694 -0
  46. claude_mpm/cli/commands/skills.py +757 -20
  47. claude_mpm/cli/executor.py +78 -3
  48. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  49. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  50. claude_mpm/cli/parsers/agents_parser.py +310 -4
  51. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  52. claude_mpm/cli/parsers/base_parser.py +53 -0
  53. claude_mpm/cli/parsers/config_parser.py +96 -43
  54. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  55. claude_mpm/cli/parsers/skills_parser.py +145 -0
  56. claude_mpm/cli/parsers/source_parser.py +138 -0
  57. claude_mpm/cli/startup.py +564 -108
  58. claude_mpm/cli/startup_display.py +480 -0
  59. claude_mpm/cli/utils.py +1 -1
  60. claude_mpm/cli_module/commands.py +1 -1
  61. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  62. claude_mpm/commands/mpm-agents-detect.md +9 -0
  63. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  64. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  65. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  66. claude_mpm/commands/mpm-doctor.md +9 -0
  67. claude_mpm/commands/mpm-help.md +14 -2
  68. claude_mpm/commands/mpm-init.md +27 -2
  69. claude_mpm/commands/mpm-monitor.md +9 -0
  70. claude_mpm/commands/mpm-postmortem.md +123 -0
  71. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  72. claude_mpm/commands/mpm-status.md +9 -0
  73. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  74. claude_mpm/commands/mpm-ticket-view.md +552 -0
  75. claude_mpm/commands/mpm-version.md +9 -0
  76. claude_mpm/commands/mpm.md +10 -0
  77. claude_mpm/config/agent_presets.py +488 -0
  78. claude_mpm/config/agent_sources.py +325 -0
  79. claude_mpm/config/skill_presets.py +392 -0
  80. claude_mpm/config/skill_sources.py +590 -0
  81. claude_mpm/constants.py +13 -0
  82. claude_mpm/core/api_validator.py +1 -1
  83. claude_mpm/core/claude_runner.py +19 -35
  84. claude_mpm/core/config.py +24 -0
  85. claude_mpm/core/constants.py +1 -1
  86. claude_mpm/core/framework/__init__.py +3 -16
  87. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  88. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  89. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  90. claude_mpm/core/hook_error_memory.py +381 -0
  91. claude_mpm/core/hook_manager.py +41 -2
  92. claude_mpm/core/interactive_session.py +131 -10
  93. claude_mpm/core/logger.py +3 -1
  94. claude_mpm/core/oneshot_session.py +110 -8
  95. claude_mpm/core/output_style_manager.py +173 -43
  96. claude_mpm/core/protocols/__init__.py +23 -0
  97. claude_mpm/core/protocols/runner_protocol.py +103 -0
  98. claude_mpm/core/protocols/session_protocol.py +131 -0
  99. claude_mpm/core/shared/singleton_manager.py +11 -4
  100. claude_mpm/core/system_context.py +38 -0
  101. claude_mpm/core/unified_agent_registry.py +129 -1
  102. claude_mpm/core/unified_config.py +22 -0
  103. claude_mpm/dashboard/static/css/activity.css +69 -69
  104. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  105. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  106. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  107. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  108. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  109. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  110. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  111. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  112. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  113. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  114. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  115. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  116. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  117. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  118. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  119. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  120. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  121. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  122. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  123. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  124. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  125. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  126. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  127. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  128. claude_mpm/dashboard/templates/code_simple.html +23 -23
  129. claude_mpm/dashboard/templates/index.html +18 -18
  130. claude_mpm/experimental/cli_enhancements.py +1 -5
  131. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  132. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  133. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  134. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  135. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  136. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  137. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  139. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  140. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  141. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  142. claude_mpm/models/agent_definition.py +7 -0
  143. claude_mpm/models/git_repository.py +198 -0
  144. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  145. claude_mpm/scripts/start_activity_logging.py +3 -1
  146. claude_mpm/services/agents/agent_builder.py +45 -9
  147. claude_mpm/services/agents/agent_preset_service.py +238 -0
  148. claude_mpm/services/agents/agent_selection_service.py +484 -0
  149. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  150. claude_mpm/services/agents/cache_git_manager.py +621 -0
  151. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  152. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  153. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  154. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  155. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  156. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  157. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  158. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  159. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  160. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  161. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +225 -18
  162. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  163. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  164. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +557 -0
  165. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  166. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  167. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  168. claude_mpm/services/agents/git_source_manager.py +629 -0
  169. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  170. claude_mpm/services/agents/local_template_manager.py +50 -10
  171. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  172. claude_mpm/services/agents/sources/__init__.py +13 -0
  173. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  174. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  175. claude_mpm/services/agents/startup_sync.py +239 -0
  176. claude_mpm/services/agents/toolchain_detector.py +474 -0
  177. claude_mpm/services/analysis/__init__.py +25 -0
  178. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  179. claude_mpm/services/analysis/postmortem_service.py +765 -0
  180. claude_mpm/services/cli/session_pause_manager.py +1 -1
  181. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  182. claude_mpm/services/command_deployment_service.py +200 -6
  183. claude_mpm/services/core/base.py +7 -2
  184. claude_mpm/services/core/interfaces/__init__.py +1 -3
  185. claude_mpm/services/core/interfaces/health.py +1 -4
  186. claude_mpm/services/core/models/__init__.py +2 -11
  187. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  188. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  189. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  190. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  191. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  192. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  193. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  194. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  195. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  196. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  197. claude_mpm/services/event_bus/direct_relay.py +3 -3
  198. claude_mpm/services/event_bus/event_bus.py +36 -3
  199. claude_mpm/services/events/consumers/logging.py +1 -2
  200. claude_mpm/services/git/__init__.py +21 -0
  201. claude_mpm/services/git/git_operations_service.py +494 -0
  202. claude_mpm/services/github/__init__.py +21 -0
  203. claude_mpm/services/github/github_cli_service.py +397 -0
  204. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  205. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  206. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  207. claude_mpm/services/instructions/__init__.py +9 -0
  208. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  209. claude_mpm/services/local_ops/__init__.py +3 -13
  210. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  211. claude_mpm/services/local_ops/health_manager.py +1 -4
  212. claude_mpm/services/local_ops/process_manager.py +1 -1
  213. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  214. claude_mpm/services/mcp_config_manager.py +75 -145
  215. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  216. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  217. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  218. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  219. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  220. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  221. claude_mpm/services/mcp_service_verifier.py +6 -3
  222. claude_mpm/services/memory/optimizer.py +1 -1
  223. claude_mpm/services/model/model_router.py +8 -9
  224. claude_mpm/services/monitor/daemon.py +29 -9
  225. claude_mpm/services/monitor/daemon_manager.py +96 -19
  226. claude_mpm/services/monitor/server.py +2 -2
  227. claude_mpm/services/native_agent_converter.py +356 -0
  228. claude_mpm/services/port_manager.py +1 -1
  229. claude_mpm/services/pr/__init__.py +14 -0
  230. claude_mpm/services/pr/pr_template_service.py +329 -0
  231. claude_mpm/services/project/documentation_manager.py +2 -1
  232. claude_mpm/services/project/project_organizer.py +4 -0
  233. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  234. claude_mpm/services/runner_configuration_service.py +17 -3
  235. claude_mpm/services/self_upgrade_service.py +165 -7
  236. claude_mpm/services/session_management_service.py +16 -4
  237. claude_mpm/services/skills/__init__.py +18 -0
  238. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  239. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  240. claude_mpm/services/skills_config.py +547 -0
  241. claude_mpm/services/skills_deployer.py +955 -0
  242. claude_mpm/services/socketio/handlers/connection.py +1 -1
  243. claude_mpm/services/socketio/handlers/git.py +2 -2
  244. claude_mpm/services/socketio/server/core.py +1 -4
  245. claude_mpm/services/socketio/server/main.py +1 -3
  246. claude_mpm/services/system_instructions_service.py +1 -3
  247. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  248. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  249. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  250. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  251. claude_mpm/services/unified/unified_deployment.py +1 -5
  252. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  253. claude_mpm/services/visualization/__init__.py +1 -5
  254. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  255. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  256. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  257. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  258. claude_mpm/skills/skills_registry.py +0 -1
  259. claude_mpm/templates/questions/__init__.py +38 -0
  260. claude_mpm/templates/questions/base.py +193 -0
  261. claude_mpm/templates/questions/pr_strategy.py +311 -0
  262. claude_mpm/templates/questions/project_init.py +385 -0
  263. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  264. claude_mpm/tools/__main__.py +8 -8
  265. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  266. claude_mpm/utils/agent_dependency_loader.py +80 -13
  267. claude_mpm/utils/agent_filters.py +288 -0
  268. claude_mpm/utils/dependency_cache.py +3 -1
  269. claude_mpm/utils/gitignore.py +244 -0
  270. claude_mpm/utils/log_cleanup.py +3 -3
  271. claude_mpm/utils/migration.py +372 -0
  272. claude_mpm/utils/progress.py +387 -0
  273. claude_mpm/utils/robust_installer.py +3 -5
  274. claude_mpm/utils/structured_questions.py +619 -0
  275. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
  276. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
  277. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  278. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  279. claude_mpm/agents/templates/agent-manager.json +0 -273
  280. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  281. claude_mpm/agents/templates/api_qa.json +0 -180
  282. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  283. claude_mpm/agents/templates/clerk-ops.json +0 -235
  284. claude_mpm/agents/templates/code_analyzer.json +0 -101
  285. claude_mpm/agents/templates/content-agent.json +0 -358
  286. claude_mpm/agents/templates/dart_engineer.json +0 -307
  287. claude_mpm/agents/templates/data_engineer.json +0 -225
  288. claude_mpm/agents/templates/documentation.json +0 -211
  289. claude_mpm/agents/templates/engineer.json +0 -210
  290. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  291. claude_mpm/agents/templates/golang_engineer.json +0 -270
  292. claude_mpm/agents/templates/imagemagick.json +0 -264
  293. claude_mpm/agents/templates/java_engineer.json +0 -346
  294. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  295. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  296. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  297. claude_mpm/agents/templates/memory_manager.json +0 -158
  298. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  299. claude_mpm/agents/templates/ops.json +0 -185
  300. claude_mpm/agents/templates/php-engineer.json +0 -287
  301. claude_mpm/agents/templates/product_owner.json +0 -338
  302. claude_mpm/agents/templates/project_organizer.json +0 -140
  303. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  304. claude_mpm/agents/templates/python_engineer.json +0 -387
  305. claude_mpm/agents/templates/qa.json +0 -242
  306. claude_mpm/agents/templates/react_engineer.json +0 -238
  307. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  308. claude_mpm/agents/templates/research.json +0 -188
  309. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  310. claude_mpm/agents/templates/rust_engineer.json +0 -275
  311. claude_mpm/agents/templates/security.json +0 -202
  312. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  313. claude_mpm/agents/templates/ticketing.json +0 -177
  314. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  315. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  316. claude_mpm/agents/templates/version_control.json +0 -157
  317. claude_mpm/agents/templates/web_qa.json +0 -399
  318. claude_mpm/agents/templates/web_ui.json +0 -189
  319. claude_mpm/commands/mpm-tickets.md +0 -102
  320. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  321. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  322. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  323. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  324. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  325. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  326. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  327. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  328. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  329. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  330. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  331. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  332. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  333. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  334. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  335. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  336. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  337. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  338. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  339. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  340. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  341. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  342. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  343. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  344. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  345. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  346. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  347. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  348. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  349. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  350. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  351. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  352. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  353. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  354. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  355. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  357. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  358. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  359. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  366. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  367. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  368. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  369. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  370. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  371. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  372. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  373. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  374. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  375. claude_mpm/dashboard/static/built/react/events.js +0 -30
  376. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  377. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  378. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  379. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  380. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  381. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  382. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  383. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  384. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  385. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  388. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  389. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  390. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  391. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  392. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  393. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  394. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  395. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  396. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  397. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  398. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  399. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  400. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  401. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  402. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  403. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  404. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  405. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  406. claude_mpm/dashboard/static/events.html +0 -607
  407. claude_mpm/dashboard/static/index.html +0 -635
  408. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  409. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  410. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  411. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  412. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  413. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  414. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  415. claude_mpm/dashboard/static/legacy/files.html +0 -747
  416. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  417. claude_mpm/dashboard/static/monitors.html +0 -431
  418. claude_mpm/dashboard/static/production/events.html +0 -659
  419. claude_mpm/dashboard/static/production/main.html +0 -698
  420. claude_mpm/dashboard/static/production/monitors.html +0 -483
  421. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  422. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  423. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  424. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  425. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  426. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  427. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  428. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  429. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  430. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  431. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  432. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  433. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  434. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  435. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  436. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  437. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  438. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  439. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  440. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  441. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  442. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  443. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  444. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  445. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  446. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  447. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  448. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  449. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  450. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  451. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  452. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  453. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  454. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  455. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  456. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  457. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  458. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  459. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  460. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  461. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  462. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  463. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  464. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  465. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  466. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  467. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  468. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  469. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  470. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  471. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  472. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  473. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  474. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  475. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  476. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  477. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  478. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  479. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  480. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  481. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  482. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  483. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  484. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  485. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  486. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  487. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  488. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  489. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  490. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  491. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  492. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  493. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  494. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  495. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  496. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  497. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  498. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  499. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  500. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  501. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  502. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  503. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  504. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  505. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  506. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  507. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  508. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  509. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  510. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  511. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  512. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  513. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  514. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
  515. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
  516. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
  517. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/top_level.txt +0 -0
@@ -3,13 +3,16 @@ Auto-Configuration CLI Command for Claude MPM Framework
3
3
  ========================================================
4
4
 
5
5
  WHY: This module provides a user-friendly CLI interface for the auto-configuration
6
- feature, allowing users to automatically configure agents based on 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)]}