claude-mpm 4.25.10__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.
Files changed (507) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/PM_INSTRUCTIONS.md +1055 -2230
  4. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  5. claude_mpm/agents/WORKFLOW.md +4 -4
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent_loader.py +10 -35
  9. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +576 -66
  10. claude_mpm/agents/templates/context-management-examples.md +544 -0
  11. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  12. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  13. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  14. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  15. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  16. claude_mpm/cli/__init__.py +28 -3
  17. claude_mpm/cli/commands/__init__.py +2 -0
  18. claude_mpm/cli/commands/agent_source.py +774 -0
  19. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  20. claude_mpm/cli/commands/agents.py +959 -36
  21. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  22. claude_mpm/cli/commands/agents_discover.py +338 -0
  23. claude_mpm/cli/commands/auto_configure.py +537 -239
  24. claude_mpm/cli/commands/config.py +7 -4
  25. claude_mpm/cli/commands/configure.py +924 -45
  26. claude_mpm/cli/commands/configure_navigation.py +63 -46
  27. claude_mpm/cli/commands/doctor.py +10 -2
  28. claude_mpm/cli/commands/local_deploy.py +1 -4
  29. claude_mpm/cli/commands/postmortem.py +401 -0
  30. claude_mpm/cli/commands/run.py +1 -39
  31. claude_mpm/cli/commands/skill_source.py +694 -0
  32. claude_mpm/cli/commands/skills.py +322 -19
  33. claude_mpm/cli/executor.py +22 -3
  34. claude_mpm/cli/interactive/agent_wizard.py +1028 -43
  35. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  36. claude_mpm/cli/parsers/agents_parser.py +256 -4
  37. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  38. claude_mpm/cli/parsers/base_parser.py +25 -0
  39. claude_mpm/cli/parsers/config_parser.py +96 -43
  40. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  41. claude_mpm/cli/parsers/skills_parser.py +7 -0
  42. claude_mpm/cli/parsers/source_parser.py +138 -0
  43. claude_mpm/cli/startup.py +456 -103
  44. claude_mpm/cli/startup_display.py +4 -4
  45. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  46. claude_mpm/commands/mpm-agents-detect.md +9 -0
  47. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  48. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  49. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  50. claude_mpm/commands/mpm-doctor.md +9 -0
  51. claude_mpm/commands/mpm-help.md +14 -2
  52. claude_mpm/commands/mpm-init.md +9 -0
  53. claude_mpm/commands/mpm-monitor.md +9 -0
  54. claude_mpm/commands/mpm-postmortem.md +123 -0
  55. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  56. claude_mpm/commands/mpm-status.md +9 -0
  57. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  58. claude_mpm/commands/mpm-ticket-view.md +552 -0
  59. claude_mpm/commands/mpm-version.md +9 -0
  60. claude_mpm/commands/mpm.md +10 -0
  61. claude_mpm/config/agent_presets.py +488 -0
  62. claude_mpm/config/agent_sources.py +325 -0
  63. claude_mpm/config/skill_presets.py +392 -0
  64. claude_mpm/config/skill_sources.py +590 -0
  65. claude_mpm/constants.py +1 -0
  66. claude_mpm/core/claude_runner.py +5 -34
  67. claude_mpm/core/config.py +16 -0
  68. claude_mpm/core/framework/__init__.py +3 -16
  69. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  70. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  71. claude_mpm/core/interactive_session.py +83 -7
  72. claude_mpm/core/oneshot_session.py +71 -8
  73. claude_mpm/core/protocols/__init__.py +23 -0
  74. claude_mpm/core/protocols/runner_protocol.py +103 -0
  75. claude_mpm/core/protocols/session_protocol.py +131 -0
  76. claude_mpm/core/shared/singleton_manager.py +11 -4
  77. claude_mpm/core/system_context.py +38 -0
  78. claude_mpm/core/unified_config.py +22 -0
  79. claude_mpm/experimental/cli_enhancements.py +1 -5
  80. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  85. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  86. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  87. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  88. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  89. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  90. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  91. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  92. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  93. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  94. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  95. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  96. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  97. claude_mpm/models/git_repository.py +198 -0
  98. claude_mpm/services/agents/agent_builder.py +45 -9
  99. claude_mpm/services/agents/agent_preset_service.py +238 -0
  100. claude_mpm/services/agents/agent_selection_service.py +484 -0
  101. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  102. claude_mpm/services/agents/cache_git_manager.py +621 -0
  103. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  104. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  105. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  106. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  107. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  108. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  109. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  110. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  111. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  112. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  113. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  114. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  115. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  116. claude_mpm/services/agents/git_source_manager.py +629 -0
  117. claude_mpm/services/agents/loading/framework_agent_loader.py +1 -4
  118. claude_mpm/services/agents/local_template_manager.py +47 -9
  119. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  120. claude_mpm/services/agents/sources/__init__.py +13 -0
  121. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  122. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  123. claude_mpm/services/agents/startup_sync.py +239 -0
  124. claude_mpm/services/agents/toolchain_detector.py +474 -0
  125. claude_mpm/services/analysis/__init__.py +25 -0
  126. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  127. claude_mpm/services/analysis/postmortem_service.py +765 -0
  128. claude_mpm/services/command_deployment_service.py +200 -6
  129. claude_mpm/services/core/base.py +7 -2
  130. claude_mpm/services/core/interfaces/__init__.py +1 -3
  131. claude_mpm/services/core/interfaces/health.py +1 -4
  132. claude_mpm/services/core/models/__init__.py +2 -11
  133. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  134. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  135. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  136. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  137. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  138. claude_mpm/services/diagnostics/doctor_reporter.py +34 -6
  139. claude_mpm/services/git/__init__.py +21 -0
  140. claude_mpm/services/git/git_operations_service.py +494 -0
  141. claude_mpm/services/github/__init__.py +21 -0
  142. claude_mpm/services/github/github_cli_service.py +397 -0
  143. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  144. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  145. claude_mpm/services/instructions/__init__.py +9 -0
  146. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  147. claude_mpm/services/local_ops/__init__.py +3 -13
  148. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  149. claude_mpm/services/local_ops/health_manager.py +1 -4
  150. claude_mpm/services/mcp_config_manager.py +75 -145
  151. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  152. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  153. claude_mpm/services/mcp_service_verifier.py +6 -3
  154. claude_mpm/services/monitor/daemon.py +28 -8
  155. claude_mpm/services/monitor/daemon_manager.py +96 -19
  156. claude_mpm/services/pr/__init__.py +14 -0
  157. claude_mpm/services/pr/pr_template_service.py +329 -0
  158. claude_mpm/services/project/project_organizer.py +4 -0
  159. claude_mpm/services/runner_configuration_service.py +16 -3
  160. claude_mpm/services/session_management_service.py +16 -4
  161. claude_mpm/services/skills/__init__.py +18 -0
  162. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  163. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  164. claude_mpm/services/socketio/server/core.py +1 -4
  165. claude_mpm/services/socketio/server/main.py +1 -3
  166. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  167. claude_mpm/services/unified/unified_deployment.py +1 -5
  168. claude_mpm/services/visualization/__init__.py +1 -5
  169. claude_mpm/templates/questions/__init__.py +2 -7
  170. claude_mpm/templates/questions/pr_strategy.py +1 -4
  171. claude_mpm/templates/questions/project_init.py +1 -4
  172. claude_mpm/templates/questions/ticket_mgmt.py +1 -4
  173. claude_mpm/utils/agent_dependency_loader.py +77 -10
  174. claude_mpm/utils/agent_filters.py +288 -0
  175. claude_mpm/utils/gitignore.py +3 -0
  176. claude_mpm/utils/migration.py +372 -0
  177. claude_mpm/utils/progress.py +387 -0
  178. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +356 -112
  179. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +188 -439
  180. claude_mpm/agents/templates/agent-manager.json +0 -273
  181. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  182. claude_mpm/agents/templates/api_qa.json +0 -183
  183. claude_mpm/agents/templates/clerk-ops.json +0 -235
  184. claude_mpm/agents/templates/code_analyzer.json +0 -101
  185. claude_mpm/agents/templates/content-agent.json +0 -358
  186. claude_mpm/agents/templates/dart_engineer.json +0 -307
  187. claude_mpm/agents/templates/data_engineer.json +0 -225
  188. claude_mpm/agents/templates/documentation.json +0 -238
  189. claude_mpm/agents/templates/engineer.json +0 -210
  190. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  191. claude_mpm/agents/templates/golang_engineer.json +0 -270
  192. claude_mpm/agents/templates/imagemagick.json +0 -264
  193. claude_mpm/agents/templates/java_engineer.json +0 -346
  194. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  195. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  196. claude_mpm/agents/templates/memory_manager.json +0 -158
  197. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  198. claude_mpm/agents/templates/ops.json +0 -185
  199. claude_mpm/agents/templates/php-engineer.json +0 -287
  200. claude_mpm/agents/templates/product_owner.json +0 -338
  201. claude_mpm/agents/templates/project_organizer.json +0 -144
  202. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  203. claude_mpm/agents/templates/python_engineer.json +0 -387
  204. claude_mpm/agents/templates/qa.json +0 -243
  205. claude_mpm/agents/templates/react_engineer.json +0 -239
  206. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  207. claude_mpm/agents/templates/research.json +0 -258
  208. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  209. claude_mpm/agents/templates/rust_engineer.json +0 -275
  210. claude_mpm/agents/templates/security.json +0 -202
  211. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  212. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  213. claude_mpm/agents/templates/ticketing.json +0 -181
  214. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  215. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  216. claude_mpm/agents/templates/version_control.json +0 -159
  217. claude_mpm/agents/templates/web_qa.json +0 -400
  218. claude_mpm/agents/templates/web_ui.json +0 -189
  219. claude_mpm/cli/README.md +0 -253
  220. claude_mpm/cli/commands/mcp_install_commands.py.backup +0 -284
  221. claude_mpm/cli/commands/mpm_init/README.md +0 -365
  222. claude_mpm/cli_module/refactoring_guide.md +0 -253
  223. claude_mpm/commands/mpm-tickets.md +0 -151
  224. claude_mpm/config/agent_capabilities.yaml +0 -658
  225. claude_mpm/config/async_logging_config.yaml +0 -145
  226. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +0 -34
  227. claude_mpm/d2/.gitignore +0 -22
  228. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +0 -273
  229. claude_mpm/d2/FLASK_INTEGRATION.md +0 -156
  230. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +0 -452
  231. claude_mpm/d2/QUICKSTART.md +0 -186
  232. claude_mpm/d2/README.md +0 -232
  233. claude_mpm/d2/STORE_FIX_SUMMARY.md +0 -167
  234. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +0 -180
  235. claude_mpm/d2/TESTING.md +0 -288
  236. claude_mpm/d2/index.html +0 -118
  237. claude_mpm/d2/package.json +0 -19
  238. claude_mpm/d2/src/App.svelte +0 -110
  239. claude_mpm/d2/src/components/Header.svelte +0 -153
  240. claude_mpm/d2/src/components/MainContent.svelte +0 -74
  241. claude_mpm/d2/src/components/Sidebar.svelte +0 -85
  242. claude_mpm/d2/src/components/tabs/EventsTab.svelte +0 -326
  243. claude_mpm/d2/src/lib/socketio.js +0 -144
  244. claude_mpm/d2/src/main.js +0 -7
  245. claude_mpm/d2/src/stores/events.js +0 -114
  246. claude_mpm/d2/src/stores/socket.js +0 -108
  247. claude_mpm/d2/src/stores/theme.js +0 -65
  248. claude_mpm/d2/svelte.config.js +0 -12
  249. claude_mpm/d2/vite.config.js +0 -15
  250. claude_mpm/dashboard/.claude-mpm/memories/README.md +0 -36
  251. claude_mpm/dashboard/BUILD_NUMBER +0 -1
  252. claude_mpm/dashboard/README.md +0 -121
  253. claude_mpm/dashboard/VERSION +0 -1
  254. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  255. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +0 -273
  256. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +0 -75
  257. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  258. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +0 -141
  259. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  260. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +0 -36
  261. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  262. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +0 -89
  263. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +0 -215
  264. claude_mpm/dashboard/react/entries/events.tsx +0 -165
  265. claude_mpm/dashboard/react/hooks/useEvents.ts +0 -191
  266. claude_mpm/dashboard/react/hooks/useSocket.ts +0 -225
  267. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  268. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +0 -170
  269. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  270. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  271. claude_mpm/dashboard/static/built/components/activity-tree.js.map +0 -1
  272. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  273. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  274. claude_mpm/dashboard/static/built/components/agent-inference.js.map +0 -1
  275. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  276. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  277. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  278. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  279. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  280. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  281. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  282. claude_mpm/dashboard/static/built/components/code-tree.js.map +0 -1
  283. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  284. claude_mpm/dashboard/static/built/components/code-viewer.js.map +0 -1
  285. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  286. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  287. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  288. claude_mpm/dashboard/static/built/components/event-processor.js.map +0 -1
  289. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  290. claude_mpm/dashboard/static/built/components/event-viewer.js.map +0 -1
  291. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  292. claude_mpm/dashboard/static/built/components/export-manager.js.map +0 -1
  293. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  294. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  295. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  296. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +0 -1
  297. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  298. claude_mpm/dashboard/static/built/components/file-viewer.js.map +0 -1
  299. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  300. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +0 -1
  301. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  302. claude_mpm/dashboard/static/built/components/hud-manager.js.map +0 -1
  303. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  304. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +0 -1
  305. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  306. claude_mpm/dashboard/static/built/components/module-viewer.js.map +0 -1
  307. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  308. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  309. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  310. claude_mpm/dashboard/static/built/components/session-manager.js.map +0 -1
  311. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  312. claude_mpm/dashboard/static/built/components/socket-manager.js.map +0 -1
  313. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  314. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +0 -1
  315. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  316. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +0 -1
  317. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  318. claude_mpm/dashboard/static/built/components/working-directory.js.map +0 -1
  319. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  320. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  321. claude_mpm/dashboard/static/built/dashboard.js.map +0 -1
  322. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  323. claude_mpm/dashboard/static/built/react/events.js +0 -30
  324. claude_mpm/dashboard/static/built/react/events.js.map +0 -1
  325. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  326. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  327. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  328. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  329. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  330. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  331. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  332. claude_mpm/dashboard/static/built/socket-client.js.map +0 -1
  333. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  334. claude_mpm/dashboard/static/events.html +0 -607
  335. claude_mpm/dashboard/static/index.html +0 -635
  336. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +0 -170
  337. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  338. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  339. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  340. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  342. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  343. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  344. claude_mpm/dashboard/static/legacy/files.html +0 -747
  345. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  346. claude_mpm/dashboard/static/monitors.html +0 -431
  347. claude_mpm/dashboard/static/navigation-test-results.md +0 -118
  348. claude_mpm/dashboard/static/production/events.html +0 -659
  349. claude_mpm/dashboard/static/production/main.html +0 -698
  350. claude_mpm/dashboard/static/production/monitors.html +0 -483
  351. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  352. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  353. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  354. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  355. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +0 -36
  356. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +0 -39
  357. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +0 -38
  358. claude_mpm/hooks/README.md +0 -143
  359. claude_mpm/hooks/templates/README.md +0 -180
  360. claude_mpm/hooks/templates/settings.json.example +0 -147
  361. claude_mpm/schemas/agent_schema.json +0 -596
  362. claude_mpm/schemas/frontmatter_schema.json +0 -165
  363. claude_mpm/services/event_bus/README.md +0 -244
  364. claude_mpm/services/events/README.md +0 -303
  365. claude_mpm/services/framework_claude_md_generator/README.md +0 -119
  366. claude_mpm/services/mcp_gateway/README.md +0 -185
  367. claude_mpm/services/socketio/handlers/connection.py.backup +0 -217
  368. claude_mpm/services/socketio/handlers/hook.py.backup +0 -154
  369. claude_mpm/services/static/.gitkeep +0 -2
  370. claude_mpm/services/version_control/VERSION +0 -1
  371. claude_mpm/skills/bundled/.gitkeep +0 -2
  372. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  373. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  374. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  375. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  376. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  377. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  378. claude_mpm/skills/bundled/collaboration/git-worktrees.md +0 -317
  379. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  380. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  381. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  382. claude_mpm/skills/bundled/collaboration/stacked-prs.md +0 -251
  383. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  384. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  385. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  386. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  387. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +0 -63
  388. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  389. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  390. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  391. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  392. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  393. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  394. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  395. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  396. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  397. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  398. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  399. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  400. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  401. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  402. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  403. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  404. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  405. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  406. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  407. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +0 -611
  408. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +0 -596
  409. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +0 -260
  410. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +0 -315
  411. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +0 -436
  412. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +0 -433
  413. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +0 -452
  414. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +0 -404
  415. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +0 -420
  416. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +0 -202
  417. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  418. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +0 -54
  419. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +0 -322
  420. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  421. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +0 -202
  422. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  423. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  424. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  425. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  426. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  427. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +0 -202
  428. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  429. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  430. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  431. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  435. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +0 -22
  436. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +0 -2
  437. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +0 -202
  438. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  439. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  440. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  441. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  442. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  443. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  444. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  445. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  446. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  447. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  448. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  449. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  450. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  451. claude_mpm/skills/bundled/react/flexlayout-react.md +0 -742
  452. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  458. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  459. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +0 -495
  460. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +0 -599
  461. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +0 -535
  462. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +0 -613
  463. claude_mpm/skills/bundled/tauri/tauri-event-system.md +0 -648
  464. claude_mpm/skills/bundled/tauri/tauri-file-system.md +0 -673
  465. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +0 -767
  466. claude_mpm/skills/bundled/tauri/tauri-performance.md +0 -669
  467. claude_mpm/skills/bundled/tauri/tauri-state-management.md +0 -573
  468. claude_mpm/skills/bundled/tauri/tauri-testing.md +0 -384
  469. claude_mpm/skills/bundled/tauri/tauri-window-management.md +0 -628
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +0 -158
  472. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  473. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  478. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  479. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +0 -458
  480. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +0 -411
  481. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +0 -317
  482. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +0 -270
  483. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +0 -436
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +0 -202
  490. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  491. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  492. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  493. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  494. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  495. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  496. claude_mpm/templates/questions/EXAMPLES.md +0 -501
  497. claude_mpm/tools/README_SOCKETIO_DEBUG.md +0 -224
  498. claude_mpm/tools/code_tree_analyzer/README.md +0 -64
  499. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  500. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  501. /claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +0 -0
  502. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  503. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  504. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  505. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  506. {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  507. {claude_mpm-4.25.10.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)]}