claude-mpm 4.1.6__py3-none-any.whl → 4.24.0__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 (866) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__init__.py +20 -5
  4. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
  5. claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/BASE_OPS.md +219 -0
  8. claude_mpm/agents/BASE_PM.md +431 -214
  9. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
  10. claude_mpm/agents/BASE_QA.md +167 -0
  11. claude_mpm/agents/BASE_RESEARCH.md +53 -0
  12. claude_mpm/agents/MEMORY.md +3 -0
  13. claude_mpm/agents/OUTPUT_STYLE.md +335 -0
  14. claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
  15. claude_mpm/agents/WORKFLOW.md +355 -187
  16. claude_mpm/agents/agent_loader.py +40 -10
  17. claude_mpm/agents/agent_loader_integration.py +3 -2
  18. claude_mpm/agents/agents_metadata.py +57 -0
  19. claude_mpm/agents/async_agent_loader.py +3 -3
  20. claude_mpm/agents/base_agent_loader.py +11 -9
  21. claude_mpm/agents/frontmatter_validator.py +291 -251
  22. claude_mpm/agents/system_agent_config.py +3 -2
  23. claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
  24. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
  25. claude_mpm/agents/templates/README.md +465 -0
  26. claude_mpm/agents/templates/agent-manager.json +267 -18
  27. claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
  28. claude_mpm/agents/templates/api_qa.json +16 -4
  29. claude_mpm/agents/templates/circuit_breakers.md +638 -0
  30. claude_mpm/agents/templates/clerk-ops.json +235 -0
  31. claude_mpm/agents/templates/code_analyzer.json +25 -9
  32. claude_mpm/agents/templates/content-agent.json +358 -0
  33. claude_mpm/agents/templates/dart_engineer.json +307 -0
  34. claude_mpm/agents/templates/data_engineer.json +87 -14
  35. claude_mpm/agents/templates/documentation.json +76 -13
  36. claude_mpm/agents/templates/engineer.json +44 -10
  37. claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
  38. claude_mpm/agents/templates/git_file_tracking.md +584 -0
  39. claude_mpm/agents/templates/golang_engineer.json +270 -0
  40. claude_mpm/agents/templates/imagemagick.json +5 -2
  41. claude_mpm/agents/templates/java_engineer.json +346 -0
  42. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  43. claude_mpm/agents/templates/local_ops_agent.json +1840 -0
  44. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
  45. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
  46. claude_mpm/agents/templates/memory_manager.json +6 -3
  47. claude_mpm/agents/templates/nextjs_engineer.json +285 -0
  48. claude_mpm/agents/templates/ops.json +27 -8
  49. claude_mpm/agents/templates/php-engineer.json +287 -0
  50. claude_mpm/agents/templates/pm_examples.md +474 -0
  51. claude_mpm/agents/templates/pm_red_flags.md +262 -0
  52. claude_mpm/agents/templates/product_owner.json +338 -0
  53. claude_mpm/agents/templates/project_organizer.json +19 -5
  54. claude_mpm/agents/templates/prompt-engineer.json +737 -0
  55. claude_mpm/agents/templates/python_engineer.json +387 -0
  56. claude_mpm/agents/templates/qa.json +26 -6
  57. claude_mpm/agents/templates/react_engineer.json +239 -0
  58. claude_mpm/agents/templates/refactoring_engineer.json +15 -5
  59. claude_mpm/agents/templates/research.json +47 -22
  60. claude_mpm/agents/templates/response_format.md +583 -0
  61. claude_mpm/agents/templates/ruby-engineer.json +280 -0
  62. claude_mpm/agents/templates/rust_engineer.json +275 -0
  63. claude_mpm/agents/templates/security.json +59 -10
  64. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  65. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  66. claude_mpm/agents/templates/ticketing.json +16 -7
  67. claude_mpm/agents/templates/typescript_engineer.json +285 -0
  68. claude_mpm/agents/templates/validation_templates.md +312 -0
  69. claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
  70. claude_mpm/agents/templates/version_control.json +16 -4
  71. claude_mpm/agents/templates/web_qa.json +243 -21
  72. claude_mpm/agents/templates/web_ui.json +18 -5
  73. claude_mpm/cli/__init__.py +38 -363
  74. claude_mpm/cli/commands/__init__.py +8 -0
  75. claude_mpm/cli/commands/agent_manager.py +675 -20
  76. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  77. claude_mpm/cli/commands/agents.py +722 -150
  78. claude_mpm/cli/commands/agents_detect.py +380 -0
  79. claude_mpm/cli/commands/agents_recommend.py +309 -0
  80. claude_mpm/cli/commands/aggregate.py +10 -6
  81. claude_mpm/cli/commands/analyze.py +553 -0
  82. claude_mpm/cli/commands/analyze_code.py +528 -0
  83. claude_mpm/cli/commands/auto_configure.py +570 -0
  84. claude_mpm/cli/commands/cleanup.py +12 -12
  85. claude_mpm/cli/commands/config.py +47 -13
  86. claude_mpm/cli/commands/configure.py +488 -884
  87. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  88. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  89. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  90. claude_mpm/cli/commands/configure_models.py +18 -0
  91. claude_mpm/cli/commands/configure_navigation.py +167 -0
  92. claude_mpm/cli/commands/configure_paths.py +104 -0
  93. claude_mpm/cli/commands/configure_persistence.py +254 -0
  94. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  95. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  96. claude_mpm/cli/commands/configure_validators.py +73 -0
  97. claude_mpm/cli/commands/dashboard.py +286 -0
  98. claude_mpm/cli/commands/debug.py +1386 -0
  99. claude_mpm/cli/commands/doctor.py +43 -7
  100. claude_mpm/cli/commands/info.py +3 -4
  101. claude_mpm/cli/commands/local_deploy.py +537 -0
  102. claude_mpm/cli/commands/mcp.py +17 -10
  103. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  104. claude_mpm/cli/commands/mcp_config.py +154 -0
  105. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  106. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  107. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  108. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  109. claude_mpm/cli/commands/memory.py +55 -21
  110. claude_mpm/cli/commands/monitor.py +168 -617
  111. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  112. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  113. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  114. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  115. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  116. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  117. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  118. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  119. claude_mpm/cli/commands/run.py +169 -42
  120. claude_mpm/cli/commands/search.py +458 -0
  121. claude_mpm/cli/commands/skills.py +488 -0
  122. claude_mpm/cli/commands/uninstall.py +176 -0
  123. claude_mpm/cli/commands/upgrade.py +152 -0
  124. claude_mpm/cli/commands/verify.py +119 -0
  125. claude_mpm/cli/executor.py +204 -0
  126. claude_mpm/cli/helpers.py +105 -0
  127. claude_mpm/cli/interactive/__init__.py +21 -0
  128. claude_mpm/cli/interactive/agent_wizard.py +962 -0
  129. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  130. claude_mpm/cli/parser.py +79 -2
  131. claude_mpm/cli/parsers/__init__.py +7 -1
  132. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  133. claude_mpm/cli/parsers/agents_parser.py +116 -0
  134. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  135. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  136. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  137. claude_mpm/cli/parsers/base_parser.py +187 -3
  138. claude_mpm/cli/parsers/configure_parser.py +34 -15
  139. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  140. claude_mpm/cli/parsers/debug_parser.py +319 -0
  141. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  142. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  143. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  144. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  145. claude_mpm/cli/parsers/run_parser.py +5 -0
  146. claude_mpm/cli/parsers/search_parser.py +245 -0
  147. claude_mpm/cli/parsers/skills_parser.py +137 -0
  148. claude_mpm/cli/shared/argument_patterns.py +20 -13
  149. claude_mpm/cli/shared/base_command.py +2 -2
  150. claude_mpm/cli/shared/output_formatters.py +28 -19
  151. claude_mpm/cli/startup.py +562 -0
  152. claude_mpm/cli/startup_logging.py +179 -13
  153. claude_mpm/cli/utils.py +53 -2
  154. claude_mpm/commands/__init__.py +14 -0
  155. claude_mpm/commands/mpm-agents-detect.md +168 -0
  156. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  157. claude_mpm/commands/mpm-agents.md +122 -0
  158. claude_mpm/commands/mpm-auto-configure.md +269 -0
  159. claude_mpm/commands/mpm-config.md +141 -0
  160. claude_mpm/commands/mpm-doctor.md +24 -0
  161. claude_mpm/commands/mpm-help.md +290 -0
  162. claude_mpm/commands/mpm-init.md +521 -0
  163. claude_mpm/commands/mpm-monitor.md +409 -0
  164. claude_mpm/commands/mpm-organize.md +295 -0
  165. claude_mpm/commands/mpm-resume.md +372 -0
  166. claude_mpm/commands/mpm-status.md +75 -0
  167. claude_mpm/commands/mpm-tickets.md +151 -0
  168. claude_mpm/commands/mpm-version.md +113 -0
  169. claude_mpm/commands/mpm.md +21 -0
  170. claude_mpm/config/agent_config.py +4 -4
  171. claude_mpm/config/experimental_features.py +7 -7
  172. claude_mpm/config/model_config.py +428 -0
  173. claude_mpm/config/paths.py +3 -2
  174. claude_mpm/config/socketio_config.py +36 -7
  175. claude_mpm/constants.py +27 -1
  176. claude_mpm/core/__init__.py +53 -17
  177. claude_mpm/core/agent_name_normalizer.py +3 -2
  178. claude_mpm/core/agent_registry.py +2 -2
  179. claude_mpm/core/agent_session_manager.py +10 -10
  180. claude_mpm/core/api_validator.py +330 -0
  181. claude_mpm/core/base_service.py +33 -23
  182. claude_mpm/core/cache.py +9 -9
  183. claude_mpm/core/claude_runner.py +19 -8
  184. claude_mpm/core/config.py +103 -8
  185. claude_mpm/core/config_aliases.py +7 -6
  186. claude_mpm/core/constants.py +65 -0
  187. claude_mpm/core/container.py +11 -5
  188. claude_mpm/core/enums.py +452 -0
  189. claude_mpm/core/error_handler.py +623 -0
  190. claude_mpm/core/factories.py +1 -1
  191. claude_mpm/core/file_utils.py +764 -0
  192. claude_mpm/core/framework/__init__.py +38 -0
  193. claude_mpm/core/framework/formatters/__init__.py +11 -0
  194. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  195. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  196. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  197. claude_mpm/core/framework/loaders/__init__.py +13 -0
  198. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  199. claude_mpm/core/framework/loaders/file_loader.py +223 -0
  200. claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
  201. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  202. claude_mpm/core/framework/processors/__init__.py +11 -0
  203. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  204. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  205. claude_mpm/core/framework/processors/template_processor.py +244 -0
  206. claude_mpm/core/framework_loader.py +323 -1491
  207. claude_mpm/core/hook_manager.py +8 -6
  208. claude_mpm/core/injectable_service.py +11 -8
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +55 -8
  211. claude_mpm/core/interfaces.py +56 -1
  212. claude_mpm/core/lazy.py +3 -3
  213. claude_mpm/core/log_manager.py +100 -28
  214. claude_mpm/core/logger.py +19 -14
  215. claude_mpm/core/logging_config.py +6 -2
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/oneshot_session.py +51 -7
  218. claude_mpm/core/optimized_agent_loader.py +9 -9
  219. claude_mpm/core/optimized_startup.py +1 -1
  220. claude_mpm/core/output_style_manager.py +12 -192
  221. claude_mpm/core/pm_hook_interceptor.py +118 -15
  222. claude_mpm/core/service_registry.py +7 -3
  223. claude_mpm/core/session_manager.py +14 -12
  224. claude_mpm/core/shared/config_loader.py +1 -1
  225. claude_mpm/core/socketio_pool.py +15 -15
  226. claude_mpm/core/tool_access_control.py +3 -2
  227. claude_mpm/core/types.py +4 -11
  228. claude_mpm/core/typing_utils.py +7 -6
  229. claude_mpm/core/unified_agent_registry.py +116 -12
  230. claude_mpm/core/unified_config.py +6 -6
  231. claude_mpm/core/unified_paths.py +23 -20
  232. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
  233. claude_mpm/dashboard/__init__.py +12 -0
  234. claude_mpm/dashboard/analysis_runner.py +455 -0
  235. claude_mpm/dashboard/api/simple_directory.py +261 -0
  236. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  237. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  238. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  239. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  240. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  241. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  242. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  243. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  244. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  245. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  246. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  247. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  248. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  249. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  250. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  251. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  252. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  253. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  254. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  255. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  256. claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
  257. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  258. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  259. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  260. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  261. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  262. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  263. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  264. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  265. claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
  266. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
  267. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  268. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  269. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  270. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  271. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  272. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  273. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  274. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  275. claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
  276. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  277. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  278. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  279. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  280. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
  281. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  282. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  283. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  284. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  285. claude_mpm/dashboard/static/built/react/events.js +30 -0
  286. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  287. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  288. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  289. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  290. claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
  291. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  292. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  293. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  294. claude_mpm/dashboard/static/css/activity.css +1958 -0
  295. claude_mpm/dashboard/static/css/dashboard.css +1413 -72
  296. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  297. claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  298. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  299. claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  300. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  301. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  302. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  303. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  304. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  305. claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
  306. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  307. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  308. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
  309. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  310. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  311. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  312. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  313. claude_mpm/dashboard/static/events.html +607 -0
  314. claude_mpm/dashboard/static/index.html +635 -0
  315. claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
  316. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  317. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  318. claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
  319. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  320. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  321. claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
  322. claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
  323. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  324. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  325. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  326. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  327. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  328. claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
  329. claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
  330. claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
  331. claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
  332. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
  333. claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
  334. claude_mpm/dashboard/static/js/connection-manager.js +1 -1
  335. claude_mpm/dashboard/static/js/dashboard.js +523 -622
  336. claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
  337. claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
  338. claude_mpm/dashboard/static/js/shared/logger.js +385 -0
  339. claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
  340. claude_mpm/dashboard/static/js/socket-client.js +549 -62
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  342. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  343. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  344. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  345. claude_mpm/dashboard/static/legacy/files.html +747 -0
  346. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  347. claude_mpm/dashboard/static/monitors.html +431 -0
  348. claude_mpm/dashboard/static/production/events.html +659 -0
  349. claude_mpm/dashboard/static/production/main.html +698 -0
  350. claude_mpm/dashboard/static/production/monitors.html +483 -0
  351. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  352. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  353. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  354. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  355. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  356. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  357. claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
  358. claude_mpm/dashboard/templates/code_simple.html +153 -0
  359. claude_mpm/dashboard/templates/index.html +267 -9
  360. claude_mpm/experimental/__init__.py +10 -0
  361. claude_mpm/experimental/cli_enhancements.py +4 -2
  362. claude_mpm/generators/agent_profile_generator.py +5 -3
  363. claude_mpm/hooks/__init__.py +37 -1
  364. claude_mpm/hooks/base_hook.py +5 -4
  365. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  366. claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
  367. claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
  368. claude_mpm/hooks/claude_hooks/installer.py +783 -0
  369. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  370. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  371. claude_mpm/hooks/claude_hooks/services/connection_manager.py +64 -49
  372. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  373. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  374. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  375. claude_mpm/hooks/failure_learning/__init__.py +60 -0
  376. claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
  377. claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
  378. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
  379. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  380. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  381. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  382. claude_mpm/hooks/kuzu_response_hook.py +183 -0
  383. claude_mpm/hooks/memory_integration_hook.py +1 -1
  384. claude_mpm/hooks/session_resume_hook.py +121 -0
  385. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  386. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  387. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  388. claude_mpm/hooks/validation_hooks.py +3 -3
  389. claude_mpm/init.py +23 -4
  390. claude_mpm/models/agent_session.py +8 -6
  391. claude_mpm/models/resume_log.py +340 -0
  392. claude_mpm/schemas/__init__.py +12 -0
  393. claude_mpm/scripts/claude-hook-handler.sh +187 -0
  394. claude_mpm/scripts/launch_monitor.py +85 -0
  395. claude_mpm/scripts/mcp_server.py +3 -5
  396. claude_mpm/scripts/mpm_doctor.py +3 -2
  397. claude_mpm/scripts/socketio_daemon.py +156 -396
  398. claude_mpm/services/__init__.py +144 -160
  399. claude_mpm/services/agents/__init__.py +18 -5
  400. claude_mpm/services/agents/agent_builder.py +13 -11
  401. claude_mpm/services/agents/auto_config_manager.py +796 -0
  402. claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
  403. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  404. claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
  405. claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
  406. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  407. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  408. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
  409. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  410. claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
  411. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  412. claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
  413. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  414. claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
  415. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  416. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  417. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  418. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  419. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  420. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  421. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  422. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
  423. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  424. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  425. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  426. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  427. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  428. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  429. claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
  430. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  431. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  432. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  433. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  434. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  435. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
  436. claude_mpm/services/agents/local_template_manager.py +744 -0
  437. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  438. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  439. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  440. claude_mpm/services/agents/memory/content_manager.py +17 -9
  441. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  442. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  443. claude_mpm/services/agents/memory/memory_format_service.py +7 -7
  444. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  445. claude_mpm/services/agents/memory/template_generator.py +3 -3
  446. claude_mpm/services/agents/observers.py +547 -0
  447. claude_mpm/services/agents/recommender.py +615 -0
  448. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  449. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  450. claude_mpm/services/async_session_logger.py +141 -98
  451. claude_mpm/services/claude_session_logger.py +82 -74
  452. claude_mpm/services/cli/agent_cleanup_service.py +6 -5
  453. claude_mpm/services/cli/agent_dependency_service.py +1 -1
  454. claude_mpm/services/cli/agent_listing_service.py +5 -5
  455. claude_mpm/services/cli/agent_validation_service.py +6 -5
  456. claude_mpm/services/cli/memory_crud_service.py +12 -7
  457. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  458. claude_mpm/services/cli/resume_service.py +617 -0
  459. claude_mpm/services/cli/session_manager.py +104 -13
  460. claude_mpm/services/cli/session_pause_manager.py +504 -0
  461. claude_mpm/services/cli/session_resume_helper.py +372 -0
  462. claude_mpm/services/cli/startup_checker.py +13 -21
  463. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  464. claude_mpm/services/command_deployment_service.py +17 -9
  465. claude_mpm/services/command_handler_service.py +11 -5
  466. claude_mpm/services/core/__init__.py +33 -1
  467. claude_mpm/services/core/base.py +26 -11
  468. claude_mpm/services/core/cache_manager.py +1 -3
  469. claude_mpm/services/core/interfaces/__init__.py +90 -3
  470. claude_mpm/services/core/interfaces/agent.py +184 -0
  471. claude_mpm/services/core/interfaces/health.py +172 -0
  472. claude_mpm/services/core/interfaces/model.py +281 -0
  473. claude_mpm/services/core/interfaces/process.py +372 -0
  474. claude_mpm/services/core/interfaces/project.py +121 -0
  475. claude_mpm/services/core/interfaces/restart.py +307 -0
  476. claude_mpm/services/core/interfaces/stability.py +260 -0
  477. claude_mpm/services/core/interfaces.py +56 -1
  478. claude_mpm/services/core/memory_manager.py +92 -47
  479. claude_mpm/services/core/models/__init__.py +79 -0
  480. claude_mpm/services/core/models/agent_config.py +384 -0
  481. claude_mpm/services/core/models/health.py +162 -0
  482. claude_mpm/services/core/models/process.py +239 -0
  483. claude_mpm/services/core/models/restart.py +302 -0
  484. claude_mpm/services/core/models/stability.py +264 -0
  485. claude_mpm/services/core/models/toolchain.py +306 -0
  486. claude_mpm/services/core/path_resolver.py +37 -18
  487. claude_mpm/services/core/service_container.py +2 -2
  488. claude_mpm/services/diagnostics/__init__.py +2 -2
  489. claude_mpm/services/diagnostics/checks/__init__.py +4 -2
  490. claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
  491. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  492. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  493. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  494. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  495. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  496. claude_mpm/services/diagnostics/checks/instructions_check.py +22 -24
  497. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
  498. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
  499. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
  500. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  501. claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
  502. claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
  503. claude_mpm/services/diagnostics/models.py +37 -21
  504. claude_mpm/services/event_aggregator.py +5 -3
  505. claude_mpm/services/event_bus/direct_relay.py +152 -13
  506. claude_mpm/services/event_bus/event_bus.py +51 -9
  507. claude_mpm/services/event_bus/relay.py +33 -14
  508. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  509. claude_mpm/services/events/core.py +5 -6
  510. claude_mpm/services/events/producers/hook.py +6 -6
  511. claude_mpm/services/events/producers/system.py +8 -8
  512. claude_mpm/services/exceptions.py +5 -5
  513. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  514. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  515. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  516. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  517. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  518. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  519. claude_mpm/services/hook_installer_service.py +506 -0
  520. claude_mpm/services/hook_service.py +5 -6
  521. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  522. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  523. claude_mpm/services/infrastructure/logging.py +2 -2
  524. claude_mpm/services/infrastructure/monitoring/__init__.py +12 -12
  525. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  526. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  527. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  528. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  529. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  530. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  531. claude_mpm/services/infrastructure/monitoring.py +12 -12
  532. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  533. claude_mpm/services/local_ops/__init__.py +165 -0
  534. claude_mpm/services/local_ops/crash_detector.py +257 -0
  535. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  536. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  537. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  538. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  539. claude_mpm/services/local_ops/health_manager.py +430 -0
  540. claude_mpm/services/local_ops/log_monitor.py +396 -0
  541. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  542. claude_mpm/services/local_ops/process_manager.py +595 -0
  543. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  544. claude_mpm/services/local_ops/restart_manager.py +401 -0
  545. claude_mpm/services/local_ops/restart_policy.py +387 -0
  546. claude_mpm/services/local_ops/state_manager.py +372 -0
  547. claude_mpm/services/local_ops/unified_manager.py +600 -0
  548. claude_mpm/services/mcp_config_manager.py +1612 -0
  549. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  550. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  551. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  552. claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
  553. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  554. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  555. claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
  556. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  557. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  558. claude_mpm/services/mcp_gateway/main.py +90 -15
  559. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  560. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  561. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
  562. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
  563. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  564. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  565. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  566. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  567. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  568. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  569. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
  570. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  571. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  572. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  573. claude_mpm/services/mcp_service_verifier.py +729 -0
  574. claude_mpm/services/memory/builder.py +9 -8
  575. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  576. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  577. claude_mpm/services/memory/failure_tracker.py +578 -0
  578. claude_mpm/services/memory/indexed_memory.py +8 -8
  579. claude_mpm/services/memory/optimizer.py +8 -9
  580. claude_mpm/services/memory/router.py +3 -3
  581. claude_mpm/services/memory_hook_service.py +165 -4
  582. claude_mpm/services/model/__init__.py +147 -0
  583. claude_mpm/services/model/base_provider.py +365 -0
  584. claude_mpm/services/model/claude_provider.py +412 -0
  585. claude_mpm/services/model/model_router.py +453 -0
  586. claude_mpm/services/model/ollama_provider.py +415 -0
  587. claude_mpm/services/monitor/__init__.py +20 -0
  588. claude_mpm/services/monitor/daemon.py +671 -0
  589. claude_mpm/services/monitor/daemon_manager.py +963 -0
  590. claude_mpm/services/monitor/event_emitter.py +350 -0
  591. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  592. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  593. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  594. claude_mpm/services/monitor/handlers/file.py +264 -0
  595. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  596. claude_mpm/services/monitor/management/__init__.py +18 -0
  597. claude_mpm/services/monitor/management/health.py +124 -0
  598. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  599. claude_mpm/services/monitor/server.py +817 -0
  600. claude_mpm/services/monitor_build_service.py +2 -2
  601. claude_mpm/services/native_agent_converter.py +356 -0
  602. claude_mpm/services/orphan_detection.py +786 -0
  603. claude_mpm/services/port_manager.py +2 -2
  604. claude_mpm/services/project/__init__.py +23 -0
  605. claude_mpm/services/project/analyzer.py +3 -3
  606. claude_mpm/services/project/architecture_analyzer.py +6 -6
  607. claude_mpm/services/project/archive_manager.py +1045 -0
  608. claude_mpm/services/project/dependency_analyzer.py +8 -8
  609. claude_mpm/services/project/detection_strategies.py +719 -0
  610. claude_mpm/services/project/documentation_manager.py +553 -0
  611. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  612. claude_mpm/services/project/language_analyzer.py +3 -3
  613. claude_mpm/services/project/metrics_collector.py +7 -10
  614. claude_mpm/services/project/project_organizer.py +1005 -0
  615. claude_mpm/services/project/registry.py +13 -7
  616. claude_mpm/services/project/toolchain_analyzer.py +581 -0
  617. claude_mpm/services/project_port_allocator.py +596 -0
  618. claude_mpm/services/response_tracker.py +21 -10
  619. claude_mpm/services/runner_configuration_service.py +1 -0
  620. claude_mpm/services/self_upgrade_service.py +500 -0
  621. claude_mpm/services/session_management_service.py +7 -5
  622. claude_mpm/services/session_manager.py +380 -0
  623. claude_mpm/services/shared/__init__.py +2 -1
  624. claude_mpm/services/shared/async_service_base.py +16 -27
  625. claude_mpm/services/shared/config_service_base.py +17 -14
  626. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  627. claude_mpm/services/shared/service_factory.py +8 -5
  628. claude_mpm/services/socketio/client_proxy.py +60 -5
  629. claude_mpm/services/socketio/dashboard_server.py +361 -0
  630. claude_mpm/services/socketio/event_normalizer.py +74 -6
  631. claude_mpm/services/socketio/handlers/__init__.py +5 -0
  632. claude_mpm/services/socketio/handlers/base.py +2 -2
  633. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  634. claude_mpm/services/socketio/handlers/connection.py +21 -40
  635. claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
  636. claude_mpm/services/socketio/handlers/file.py +46 -10
  637. claude_mpm/services/socketio/handlers/git.py +8 -8
  638. claude_mpm/services/socketio/handlers/hook.py +29 -17
  639. claude_mpm/services/socketio/handlers/registry.py +4 -0
  640. claude_mpm/services/socketio/monitor_client.py +364 -0
  641. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  642. claude_mpm/services/socketio/server/connection_manager.py +131 -68
  643. claude_mpm/services/socketio/server/core.py +275 -22
  644. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  645. claude_mpm/services/socketio/server/main.py +99 -29
  646. claude_mpm/services/socketio_client_manager.py +4 -4
  647. claude_mpm/services/subprocess_launcher_service.py +19 -15
  648. claude_mpm/services/system_instructions_service.py +2 -2
  649. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  650. claude_mpm/services/ticket_services/validation_service.py +5 -5
  651. claude_mpm/services/unified/__init__.py +65 -0
  652. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  653. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  654. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  655. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
  656. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
  657. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  658. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  659. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  660. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  661. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  662. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  663. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  664. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  665. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  666. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  667. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  668. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  669. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  670. claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
  671. claude_mpm/services/unified/interfaces.py +475 -0
  672. claude_mpm/services/unified/migration.py +509 -0
  673. claude_mpm/services/unified/strategies.py +534 -0
  674. claude_mpm/services/unified/unified_analyzer.py +542 -0
  675. claude_mpm/services/unified/unified_config.py +691 -0
  676. claude_mpm/services/unified/unified_deployment.py +470 -0
  677. claude_mpm/services/utility_service.py +6 -3
  678. claude_mpm/services/version_control/branch_strategy.py +2 -2
  679. claude_mpm/services/version_control/conflict_resolution.py +8 -4
  680. claude_mpm/services/version_control/git_operations.py +26 -24
  681. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  682. claude_mpm/services/version_control/version_parser.py +14 -11
  683. claude_mpm/services/version_service.py +104 -1
  684. claude_mpm/services/visualization/__init__.py +19 -0
  685. claude_mpm/services/visualization/mermaid_generator.py +938 -0
  686. claude_mpm/skills/__init__.py +42 -0
  687. claude_mpm/skills/agent_skills_injector.py +324 -0
  688. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  689. claude_mpm/skills/bundled/__init__.py +6 -0
  690. claude_mpm/skills/bundled/api-documentation.md +393 -0
  691. claude_mpm/skills/bundled/async-testing.md +571 -0
  692. claude_mpm/skills/bundled/code-review.md +143 -0
  693. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  694. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  695. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  696. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  697. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  698. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  699. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  700. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  701. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  702. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  703. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  704. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  705. claude_mpm/skills/bundled/database-migration.md +199 -0
  706. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  707. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  708. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  709. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  710. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  711. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  712. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  713. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  714. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  715. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  716. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  717. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  718. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  719. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  720. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  721. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  722. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  723. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  724. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  725. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  726. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  727. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  728. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  729. claude_mpm/skills/bundled/git-workflow.md +414 -0
  730. claude_mpm/skills/bundled/imagemagick.md +204 -0
  731. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  732. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  733. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  734. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  735. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  736. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  737. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  738. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  739. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  740. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  741. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  742. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  743. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  744. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  745. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  746. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  747. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  748. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  749. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  750. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  751. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  752. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  753. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  754. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  755. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  756. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  757. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  758. claude_mpm/skills/bundled/pdf.md +141 -0
  759. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  760. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  761. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  762. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  763. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  764. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  765. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  766. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  767. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  768. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  769. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  770. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  771. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  772. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  773. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  774. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  775. claude_mpm/skills/bundled/security-scanning.md +327 -0
  776. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  777. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  778. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  779. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  780. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  781. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  782. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  783. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  784. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  785. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  786. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  787. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  788. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  789. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  790. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  791. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  792. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  793. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  794. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  795. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  796. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  797. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  798. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  799. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  800. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  801. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  802. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  803. claude_mpm/skills/bundled/xlsx.md +157 -0
  804. claude_mpm/skills/registry.py +286 -0
  805. claude_mpm/skills/skill_manager.py +310 -0
  806. claude_mpm/skills/skills_registry.py +348 -0
  807. claude_mpm/skills/skills_service.py +739 -0
  808. claude_mpm/storage/state_storage.py +31 -31
  809. claude_mpm/tools/__init__.py +10 -0
  810. claude_mpm/tools/__main__.py +208 -0
  811. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  812. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  813. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  814. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  815. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  816. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  817. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  818. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  819. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  820. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  821. claude_mpm/tools/code_tree_builder.py +631 -0
  822. claude_mpm/tools/code_tree_events.py +420 -0
  823. claude_mpm/tools/socketio_debug.py +671 -0
  824. claude_mpm/utils/agent_dependency_loader.py +108 -27
  825. claude_mpm/utils/common.py +544 -0
  826. claude_mpm/utils/config_manager.py +12 -6
  827. claude_mpm/utils/database_connector.py +298 -0
  828. claude_mpm/utils/dependency_cache.py +2 -2
  829. claude_mpm/utils/dependency_strategies.py +15 -10
  830. claude_mpm/utils/display_helper.py +260 -0
  831. claude_mpm/utils/environment_context.py +4 -3
  832. claude_mpm/utils/error_handler.py +5 -3
  833. claude_mpm/utils/file_utils.py +13 -14
  834. claude_mpm/utils/git_analyzer.py +407 -0
  835. claude_mpm/utils/log_cleanup.py +627 -0
  836. claude_mpm/utils/path_operations.py +7 -4
  837. claude_mpm/utils/robust_installer.py +133 -24
  838. claude_mpm/utils/session_logging.py +2 -2
  839. claude_mpm/utils/subprocess_utils.py +9 -8
  840. claude_mpm/validation/agent_validator.py +6 -6
  841. claude_mpm/validation/frontmatter_validator.py +6 -6
  842. claude_mpm-4.24.0.dist-info/METADATA +675 -0
  843. claude_mpm-4.24.0.dist-info/RECORD +1018 -0
  844. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
  845. claude_mpm/agents/INSTRUCTIONS.md +0 -237
  846. claude_mpm/agents/schema/agent_schema.json +0 -314
  847. claude_mpm/agents/templates/agent-manager.md +0 -304
  848. claude_mpm/cli/commands/configure_tui.py +0 -1921
  849. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  850. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  851. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  852. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  853. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  854. claude_mpm/scripts/socketio_server_manager.py +0 -349
  855. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  856. claude_mpm/services/cli/dashboard_launcher.py +0 -424
  857. claude_mpm/services/cli/socketio_manager.py +0 -498
  858. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  859. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  860. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  861. claude_mpm/services/project/analyzer_refactored.py +0 -450
  862. claude_mpm-4.1.6.dist-info/METADATA +0 -325
  863. claude_mpm-4.1.6.dist-info/RECORD +0 -550
  864. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
  865. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
  866. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
@@ -12,8 +12,10 @@ DESIGN DECISIONS:
12
12
  """
13
13
 
14
14
  import json
15
+ from pathlib import Path
15
16
 
16
17
  from ...constants import AgentCommands
18
+ from ...core.enums import OutputFormat
17
19
  from ...services.cli.agent_cleanup_service import AgentCleanupService
18
20
  from ...services.cli.agent_dependency_service import AgentDependencyService
19
21
  from ...services.cli.agent_listing_service import AgentListingService
@@ -26,6 +28,14 @@ from ..shared import (
26
28
  from ..utils import get_agent_versions_display
27
29
 
28
30
 
31
+ def _is_structured_output(args) -> bool:
32
+ """Check if args specify structured output format (JSON/YAML)."""
33
+ if hasattr(args, "format"):
34
+ fmt = str(args.format).lower()
35
+ return fmt in (OutputFormat.JSON, OutputFormat.YAML)
36
+ return False
37
+
38
+
29
39
  class AgentsCommand(AgentCommand):
30
40
  """Agent management command using shared utilities."""
31
41
 
@@ -50,8 +60,8 @@ class AgentsCommand(AgentCommand):
50
60
 
51
61
  base_service = AgentDeploymentService()
52
62
  self._deployment_service = DeploymentServiceWrapper(base_service)
53
- except ImportError:
54
- raise ImportError("Agent deployment service not available")
63
+ except ImportError as e:
64
+ raise ImportError("Agent deployment service not available") from e
55
65
  return self._deployment_service
56
66
 
57
67
  @property
@@ -86,6 +96,31 @@ class AgentsCommand(AgentCommand):
86
96
  )
87
97
  return self._cleanup_service
88
98
 
99
+ def _get_output_format(self, args) -> str:
100
+ """
101
+ Get output format from args with enum default.
102
+
103
+ Args:
104
+ args: Command arguments
105
+
106
+ Returns:
107
+ Output format string (compatible with both enum and string usage)
108
+ """
109
+ return getattr(args, "format", OutputFormat.TEXT)
110
+
111
+ def _is_structured_format(self, format_str: str) -> bool:
112
+ """
113
+ Check if format is structured (JSON/YAML).
114
+
115
+ Args:
116
+ format_str: Format string to check
117
+
118
+ Returns:
119
+ True if format is JSON or YAML
120
+ """
121
+ fmt = str(format_str).lower()
122
+ return fmt in (OutputFormat.JSON, OutputFormat.YAML)
123
+
89
124
  def validate_args(self, args) -> str:
90
125
  """Validate command arguments."""
91
126
  # Most agent commands are optional, so basic validation
@@ -115,6 +150,15 @@ class AgentsCommand(AgentCommand):
115
150
  "deps-list": self._list_agent_dependencies,
116
151
  "deps-fix": self._fix_agent_dependencies,
117
152
  "cleanup-orphaned": self._cleanup_orphaned_agents,
153
+ # Local agent management commands
154
+ "create": self._create_local_agent,
155
+ "edit": self._edit_local_agent,
156
+ "delete": self._delete_local_agent,
157
+ "manage": self._manage_local_agents,
158
+ "configure": self._configure_deployment,
159
+ # Auto-configuration commands (TSK-0054 Phase 5)
160
+ "detect": self._detect_toolchain,
161
+ "recommend": self._recommend_agents,
118
162
  }
119
163
 
120
164
  if args.agents_command in command_map:
@@ -135,14 +179,14 @@ class AgentsCommand(AgentCommand):
135
179
  try:
136
180
  agent_versions = get_agent_versions_display()
137
181
 
138
- output_format = getattr(args, "format", "text")
139
- if output_format in ["json", "yaml"]:
182
+ output_format = self._get_output_format(args)
183
+ if self._is_structured_format(output_format):
140
184
  # Parse the agent versions display into structured data
141
185
  if agent_versions:
142
186
  data = {"agent_versions": agent_versions, "has_agents": True}
143
187
  formatted = (
144
188
  self._formatter.format_as_json(data)
145
- if output_format == "json"
189
+ if str(output_format).lower() == OutputFormat.JSON
146
190
  else self._formatter.format_as_yaml(data)
147
191
  )
148
192
  print(formatted)
@@ -156,7 +200,7 @@ class AgentsCommand(AgentCommand):
156
200
  }
157
201
  formatted = (
158
202
  self._formatter.format_as_json(data)
159
- if output_format == "json"
203
+ if str(output_format).lower() == OutputFormat.JSON
160
204
  else self._formatter.format_as_yaml(data)
161
205
  )
162
206
  print(formatted)
@@ -178,7 +222,7 @@ class AgentsCommand(AgentCommand):
178
222
  def _list_agents(self, args) -> CommandResult:
179
223
  """List available or deployed agents."""
180
224
  try:
181
- output_format = getattr(args, "format", "text")
225
+ output_format = self._get_output_format(args)
182
226
 
183
227
  if hasattr(args, "by_tier") and args.by_tier:
184
228
  return self._list_agents_by_tier(args)
@@ -189,7 +233,7 @@ class AgentsCommand(AgentCommand):
189
233
  # Default: show usage
190
234
  usage_msg = "Use --system to list system agents, --deployed to list deployed agents, or --by-tier to group by precedence"
191
235
 
192
- if output_format in ["json", "yaml"]:
236
+ if self._is_structured_format(output_format):
193
237
  return CommandResult.error_result(
194
238
  "No list option specified",
195
239
  data={
@@ -210,7 +254,7 @@ class AgentsCommand(AgentCommand):
210
254
  verbose = getattr(args, "verbose", False)
211
255
  agents = self.listing_service.list_system_agents(verbose=verbose)
212
256
 
213
- output_format = getattr(args, "format", "text")
257
+ output_format = self._get_output_format(args)
214
258
  quiet = getattr(args, "quiet", False)
215
259
 
216
260
  # Convert AgentInfo objects to dicts for formatter
@@ -219,6 +263,7 @@ class AgentsCommand(AgentCommand):
219
263
  "name": agent.name,
220
264
  "type": agent.type,
221
265
  "path": agent.path,
266
+ "file": Path(agent.path).name if agent.path else "Unknown",
222
267
  "description": agent.description,
223
268
  "specializations": agent.specializations,
224
269
  "version": agent.version,
@@ -248,7 +293,7 @@ class AgentsCommand(AgentCommand):
248
293
  verbose=verbose
249
294
  )
250
295
 
251
- output_format = getattr(args, "format", "text")
296
+ output_format = self._get_output_format(args)
252
297
  quiet = getattr(args, "quiet", False)
253
298
 
254
299
  # Convert AgentInfo objects to dicts for formatter
@@ -258,6 +303,7 @@ class AgentsCommand(AgentCommand):
258
303
  "type": agent.type,
259
304
  "tier": agent.tier,
260
305
  "path": agent.path,
306
+ "file": Path(agent.path).name if agent.path else "Unknown",
261
307
  "description": agent.description,
262
308
  "specializations": agent.specializations,
263
309
  "version": agent.version,
@@ -272,7 +318,7 @@ class AgentsCommand(AgentCommand):
272
318
  print(formatted)
273
319
 
274
320
  # Add warnings for text output
275
- if output_format == "text" and warnings:
321
+ if str(output_format).lower() == OutputFormat.TEXT and warnings:
276
322
  print("\nWarnings:")
277
323
  for warning in warnings:
278
324
  print(f" āš ļø {warning}")
@@ -294,7 +340,7 @@ class AgentsCommand(AgentCommand):
294
340
  """List agents grouped by tier/precedence."""
295
341
  try:
296
342
  tier_info = self.listing_service.list_agents_by_tier()
297
- output_format = getattr(args, "format", "text")
343
+ output_format = self._get_output_format(args)
298
344
 
299
345
  # Convert to format expected by formatter
300
346
  agents_by_tier = {
@@ -377,7 +423,7 @@ class AgentsCommand(AgentCommand):
377
423
  or project_result.get("target_dir"),
378
424
  }
379
425
 
380
- output_format = getattr(args, "format", "text")
426
+ output_format = self._get_output_format(args)
381
427
  verbose = getattr(args, "verbose", False)
382
428
 
383
429
  formatted = self._formatter.format_deployment_result(
@@ -403,7 +449,7 @@ class AgentsCommand(AgentCommand):
403
449
  try:
404
450
  result = self.cleanup_service.clean_deployed_agents()
405
451
 
406
- output_format = getattr(args, "format", "text")
452
+ output_format = self._get_output_format(args)
407
453
  dry_run = False # Regular clean is not a dry run
408
454
 
409
455
  formatted = self._formatter.format_cleanup_result(
@@ -441,7 +487,7 @@ class AgentsCommand(AgentCommand):
441
487
  f"Could not retrieve details for agent '{agent_name}'"
442
488
  )
443
489
 
444
- output_format = getattr(args, "format", "text")
490
+ output_format = self._get_output_format(args)
445
491
  verbose = getattr(args, "verbose", False)
446
492
 
447
493
  formatted = self._formatter.format_agent_details(
@@ -463,148 +509,170 @@ class AgentsCommand(AgentCommand):
463
509
  dry_run = getattr(args, "dry_run", False)
464
510
  agent_name = getattr(args, "agent_name", None)
465
511
  fix_all = getattr(args, "all", False)
512
+ output_format = self._get_output_format(args)
466
513
 
467
- output_format = getattr(args, "format", "text")
468
-
469
- # Determine what to fix
514
+ # Route to appropriate handler based on input
470
515
  if fix_all:
471
- # Fix all agents
472
- result = self.validation_service.fix_all_agents(dry_run=dry_run)
473
-
474
- if output_format in ["json", "yaml"]:
475
- formatted = (
476
- self._formatter.format_as_json(result)
477
- if output_format == "json"
478
- else self._formatter.format_as_yaml(result)
479
- )
480
- print(formatted)
481
- else:
482
- # Text output
483
- mode = "DRY RUN" if dry_run else "FIX"
484
- print(
485
- f"\nšŸ”§ {mode}: Checking {result.get('total_agents', 0)} agent(s) for frontmatter issues...\n"
486
- )
487
-
488
- if result.get("results"):
489
- for agent_result in result["results"]:
490
- print(f"šŸ“„ {agent_result['agent']}:")
491
- if agent_result.get("skipped"):
492
- print(
493
- f" āš ļø Skipped: {agent_result.get('reason', 'Unknown reason')}"
494
- )
495
- elif agent_result.get("was_valid"):
496
- print(" āœ“ No issues found")
497
- else:
498
- if agent_result.get("errors_found", 0) > 0:
499
- print(
500
- f" āŒ Errors found: {agent_result['errors_found']}"
501
- )
502
- if agent_result.get("warnings_found", 0) > 0:
503
- print(
504
- f" āš ļø Warnings found: {agent_result['warnings_found']}"
505
- )
506
- if dry_run:
507
- if agent_result.get("corrections_available", 0) > 0:
508
- print(
509
- f" šŸ”§ Would fix: {agent_result['corrections_available']} issues"
510
- )
511
- elif agent_result.get("corrections_made", 0) > 0:
512
- print(
513
- f" āœ“ Fixed: {agent_result['corrections_made']} issues"
514
- )
515
- print()
516
-
517
- # Summary
518
- print("=" * 80)
519
- print("SUMMARY:")
520
- print(f" Agents checked: {result.get('agents_checked', 0)}")
521
- print(
522
- f" Total issues found: {result.get('total_issues_found', 0)}"
523
- )
524
- if dry_run:
525
- print(
526
- f" Issues that would be fixed: {result.get('total_corrections_available', 0)}"
527
- )
528
- print("\nšŸ’” Run without --dry-run to apply fixes")
529
- else:
530
- print(
531
- f" Issues fixed: {result.get('total_corrections_made', 0)}"
532
- )
533
- if result.get("total_corrections_made", 0) > 0:
534
- print("\nāœ“ Frontmatter issues have been fixed!")
535
- print("=" * 80 + "\n")
516
+ return self._fix_all_agents(dry_run, output_format)
517
+ if agent_name:
518
+ return self._fix_single_agent(agent_name, dry_run, output_format)
519
+ return self._handle_no_agent_specified(output_format)
536
520
 
537
- msg = f"{'Would fix' if dry_run else 'Fixed'} {result.get('total_corrections_available' if dry_run else 'total_corrections_made', 0)} issues"
538
- return CommandResult.success_result(msg, data=result)
521
+ except Exception as e:
522
+ self.logger.error(f"Error fixing agents: {e}", exc_info=True)
523
+ return CommandResult.error_result(f"Error fixing agents: {e}")
539
524
 
540
- if agent_name:
541
- # Fix specific agent
542
- result = self.validation_service.fix_agent_frontmatter(
543
- agent_name, dry_run=dry_run
544
- )
525
+ def _fix_all_agents(self, dry_run: bool, output_format: str) -> CommandResult:
526
+ """Fix all agents' frontmatter issues."""
527
+ result = self.validation_service.fix_all_agents(dry_run=dry_run)
545
528
 
546
- if not result.get("success"):
547
- return CommandResult.error_result(
548
- result.get("error", "Failed to fix agent")
549
- )
529
+ if self._is_structured_format(output_format):
530
+ self._print_structured_output(result, output_format)
531
+ else:
532
+ self._print_all_agents_text_output(result, dry_run)
550
533
 
551
- if output_format in ["json", "yaml"]:
552
- formatted = (
553
- self._formatter.format_as_json(result)
554
- if output_format == "json"
555
- else self._formatter.format_as_yaml(result)
556
- )
557
- print(formatted)
558
- else:
559
- # Text output
560
- mode = "DRY RUN" if dry_run else "FIX"
561
- print(
562
- f"\nšŸ”§ {mode}: Checking agent '{agent_name}' for frontmatter issues...\n"
563
- )
534
+ msg = f"{'Would fix' if dry_run else 'Fixed'} {result.get('total_corrections_available' if dry_run else 'total_corrections_made', 0)} issues"
535
+ return CommandResult.success_result(msg, data=result)
564
536
 
565
- print(f"šŸ“„ {agent_name}:")
566
- if result.get("was_valid"):
567
- print(" āœ“ No issues found")
568
- else:
569
- if result.get("errors_found"):
570
- print(" āŒ Errors:")
571
- for error in result["errors_found"]:
572
- print(f" - {error}")
573
- if result.get("warnings_found"):
574
- print(" āš ļø Warnings:")
575
- for warning in result["warnings_found"]:
576
- print(f" - {warning}")
577
- if dry_run:
578
- if result.get("corrections_available"):
579
- print(" šŸ”§ Would fix:")
580
- for correction in result["corrections_available"]:
581
- print(f" - {correction}")
582
- elif result.get("corrections_made"):
583
- print(" āœ“ Fixed:")
584
- for correction in result["corrections_made"]:
585
- print(f" - {correction}")
586
- print()
537
+ def _fix_single_agent(
538
+ self, agent_name: str, dry_run: bool, output_format: str
539
+ ) -> CommandResult:
540
+ """Fix a single agent's frontmatter issues."""
541
+ result = self.validation_service.fix_agent_frontmatter(
542
+ agent_name, dry_run=dry_run
543
+ )
587
544
 
588
- if dry_run and result.get("corrections_available"):
589
- print("šŸ’” Run without --dry-run to apply fixes\n")
590
- elif not dry_run and result.get("corrections_made"):
591
- print("āœ“ Frontmatter issues have been fixed!\n")
545
+ if not result.get("success"):
546
+ return CommandResult.error_result(
547
+ result.get("error", "Failed to fix agent")
548
+ )
592
549
 
593
- msg = f"{'Would fix' if dry_run else 'Fixed'} agent '{agent_name}'"
594
- return CommandResult.success_result(msg, data=result)
550
+ if self._is_structured_format(output_format):
551
+ self._print_structured_output(result, output_format)
552
+ else:
553
+ self._print_single_agent_text_output(agent_name, result, dry_run)
595
554
 
596
- # No agent specified and not --all
597
- usage_msg = "Please specify an agent name or use --all to fix all agents\nUsage: claude-mpm agents fix [agent_name] [--dry-run] [--all]"
598
- if output_format in ["json", "yaml"]:
599
- return CommandResult.error_result(
600
- "No agent specified", data={"usage": usage_msg}
601
- )
602
- print(f"āŒ {usage_msg}")
603
- return CommandResult.error_result("No agent specified")
555
+ msg = f"{'Would fix' if dry_run else 'Fixed'} agent '{agent_name}'"
556
+ return CommandResult.success_result(msg, data=result)
604
557
 
605
- except Exception as e:
606
- self.logger.error(f"Error fixing agents: {e}", exc_info=True)
607
- return CommandResult.error_result(f"Error fixing agents: {e}")
558
+ def _handle_no_agent_specified(self, output_format: str) -> CommandResult:
559
+ """Handle case where no agent is specified."""
560
+ usage_msg = "Please specify an agent name or use --all to fix all agents\nUsage: claude-mpm agents fix [agent_name] [--dry-run] [--all]"
561
+ if self._is_structured_format(output_format):
562
+ return CommandResult.error_result(
563
+ "No agent specified", data={"usage": usage_msg}
564
+ )
565
+ print(f"āŒ {usage_msg}")
566
+ return CommandResult.error_result("No agent specified")
567
+
568
+ def _print_structured_output(self, result: dict, output_format: str) -> None:
569
+ """Print result in JSON or YAML format."""
570
+ formatted = (
571
+ self._formatter.format_as_json(result)
572
+ if str(output_format).lower() == OutputFormat.JSON
573
+ else self._formatter.format_as_yaml(result)
574
+ )
575
+ print(formatted)
576
+
577
+ def _print_all_agents_text_output(self, result: dict, dry_run: bool) -> None:
578
+ """Print text output for all agents fix operation."""
579
+ mode = "DRY RUN" if dry_run else "FIX"
580
+ print(
581
+ f"\nšŸ”§ {mode}: Checking {result.get('total_agents', 0)} agent(s) for frontmatter issues...\n"
582
+ )
583
+
584
+ if result.get("results"):
585
+ for agent_result in result["results"]:
586
+ self._print_agent_result(agent_result, dry_run)
587
+
588
+ self._print_all_agents_summary(result, dry_run)
589
+
590
+ def _print_agent_result(self, agent_result: dict, dry_run: bool) -> None:
591
+ """Print result for a single agent."""
592
+ print(f"šŸ“„ {agent_result['agent']}:")
593
+ if agent_result.get("skipped"):
594
+ print(f" āš ļø Skipped: {agent_result.get('reason', 'Unknown reason')}")
595
+ elif agent_result.get("was_valid"):
596
+ print(" āœ“ No issues found")
597
+ else:
598
+ self._print_agent_issues(agent_result, dry_run)
599
+ print()
600
+
601
+ def _print_agent_issues(self, agent_result: dict, dry_run: bool) -> None:
602
+ """Print issues found for an agent."""
603
+ if agent_result.get("errors_found", 0) > 0:
604
+ print(f" āŒ Errors found: {agent_result['errors_found']}")
605
+ if agent_result.get("warnings_found", 0) > 0:
606
+ print(f" āš ļø Warnings found: {agent_result['warnings_found']}")
607
+
608
+ if dry_run:
609
+ if agent_result.get("corrections_available", 0) > 0:
610
+ print(f" šŸ”§ Would fix: {agent_result['corrections_available']} issues")
611
+ elif agent_result.get("corrections_made", 0) > 0:
612
+ print(f" āœ“ Fixed: {agent_result['corrections_made']} issues")
613
+
614
+ def _print_all_agents_summary(self, result: dict, dry_run: bool) -> None:
615
+ """Print summary for all agents fix operation."""
616
+ print("=" * 80)
617
+ print("SUMMARY:")
618
+ print(f" Agents checked: {result.get('agents_checked', 0)}")
619
+ print(f" Total issues found: {result.get('total_issues_found', 0)}")
620
+
621
+ if dry_run:
622
+ print(
623
+ f" Issues that would be fixed: {result.get('total_corrections_available', 0)}"
624
+ )
625
+ print("\nšŸ’” Run without --dry-run to apply fixes")
626
+ else:
627
+ print(f" Issues fixed: {result.get('total_corrections_made', 0)}")
628
+ if result.get("total_corrections_made", 0) > 0:
629
+ print("\nāœ“ Frontmatter issues have been fixed!")
630
+ print("=" * 80 + "\n")
631
+
632
+ def _print_single_agent_text_output(
633
+ self, agent_name: str, result: dict, dry_run: bool
634
+ ) -> None:
635
+ """Print text output for single agent fix operation."""
636
+ mode = "DRY RUN" if dry_run else "FIX"
637
+ print(f"\nšŸ”§ {mode}: Checking agent '{agent_name}' for frontmatter issues...\n")
638
+
639
+ print(f"šŸ“„ {agent_name}:")
640
+ if result.get("was_valid"):
641
+ print(" āœ“ No issues found")
642
+ else:
643
+ self._print_single_agent_issues(result, dry_run)
644
+ print()
645
+
646
+ self._print_single_agent_footer(result, dry_run)
647
+
648
+ def _print_single_agent_issues(self, result: dict, dry_run: bool) -> None:
649
+ """Print issues for a single agent."""
650
+ if result.get("errors_found"):
651
+ print(" āŒ Errors:")
652
+ for error in result["errors_found"]:
653
+ print(f" - {error}")
654
+
655
+ if result.get("warnings_found"):
656
+ print(" āš ļø Warnings:")
657
+ for warning in result["warnings_found"]:
658
+ print(f" - {warning}")
659
+
660
+ if dry_run:
661
+ if result.get("corrections_available"):
662
+ print(" šŸ”§ Would fix:")
663
+ for correction in result["corrections_available"]:
664
+ print(f" - {correction}")
665
+ elif result.get("corrections_made"):
666
+ print(" āœ“ Fixed:")
667
+ for correction in result["corrections_made"]:
668
+ print(f" - {correction}")
669
+
670
+ def _print_single_agent_footer(self, result: dict, dry_run: bool) -> None:
671
+ """Print footer message for single agent fix."""
672
+ if dry_run and result.get("corrections_available"):
673
+ print("šŸ’” Run without --dry-run to apply fixes\n")
674
+ elif not dry_run and result.get("corrections_made"):
675
+ print("āœ“ Frontmatter issues have been fixed!\n")
608
676
 
609
677
  def _check_agent_dependencies(self, args) -> CommandResult:
610
678
  """Check agent dependencies."""
@@ -684,7 +752,7 @@ class AgentsCommand(AgentCommand):
684
752
  def _list_agent_dependencies(self, args) -> CommandResult:
685
753
  """List agent dependencies."""
686
754
  try:
687
- output_format = getattr(args, "format", "text")
755
+ output_format = self._get_output_format(args)
688
756
  result = self.dependency_service.list_dependencies(
689
757
  format_type=output_format
690
758
  )
@@ -696,7 +764,7 @@ class AgentsCommand(AgentCommand):
696
764
  if output_format == "pip":
697
765
  for dep in result["dependencies"]:
698
766
  print(dep)
699
- elif output_format == "json":
767
+ elif str(output_format).lower() == OutputFormat.JSON:
700
768
  print(json.dumps(result["data"], indent=2))
701
769
  else: # text format
702
770
  print("=" * 60)
@@ -854,7 +922,7 @@ class AgentsCommand(AgentCommand):
854
922
  agents_dir=agents_dir, dry_run=dry_run
855
923
  )
856
924
 
857
- output_format = getattr(args, "format", "text")
925
+ output_format = self._get_output_format(args)
858
926
 
859
927
  formatted = self._formatter.format_cleanup_result(
860
928
  results, output_format=output_format, dry_run=dry_run
@@ -876,6 +944,510 @@ class AgentsCommand(AgentCommand):
876
944
  self.logger.error(f"Error during cleanup: {e}", exc_info=True)
877
945
  return CommandResult.error_result(f"Error during cleanup: {e}")
878
946
 
947
+ def _create_local_agent(self, args) -> CommandResult:
948
+ """Create a new local agent template."""
949
+ try:
950
+ if getattr(args, "interactive", False):
951
+ # Launch interactive wizard
952
+ from ..interactive.agent_wizard import run_interactive_agent_wizard
953
+
954
+ exit_code = run_interactive_agent_wizard()
955
+ if exit_code == 0:
956
+ return CommandResult.success_result("Agent created successfully")
957
+ return CommandResult.error_result("Agent creation cancelled or failed")
958
+
959
+ # Non-interactive creation
960
+ from ...services.agents.local_template_manager import (
961
+ LocalAgentTemplateManager,
962
+ )
963
+
964
+ agent_id = getattr(args, "agent_id", None)
965
+ if not agent_id:
966
+ return CommandResult.error_result(
967
+ "--agent-id is required for non-interactive creation"
968
+ )
969
+
970
+ manager = LocalAgentTemplateManager()
971
+ name = getattr(args, "name", agent_id.replace("-", " ").title())
972
+ model = getattr(args, "model", "sonnet")
973
+ inherit_from = getattr(args, "inherit_from", None)
974
+
975
+ # Create basic template
976
+ template = manager.create_local_template(
977
+ agent_id=agent_id,
978
+ name=name,
979
+ description=f"Local agent: {name}",
980
+ instructions="# Agent Instructions\n\nCustomize this agent's behavior here.",
981
+ model=model,
982
+ parent_agent=inherit_from,
983
+ tier="project",
984
+ )
985
+
986
+ if template:
987
+ return CommandResult.success_result(
988
+ f"Created local agent '{agent_id}' in .claude-mpm/agents/",
989
+ data={
990
+ "agent_id": agent_id,
991
+ "path": f".claude-mpm/agents/{agent_id}.json",
992
+ },
993
+ )
994
+ return CommandResult.error_result("Failed to create agent template")
995
+
996
+ except Exception as e:
997
+ self.logger.error(f"Error creating local agent: {e}", exc_info=True)
998
+ return CommandResult.error_result(f"Error creating local agent: {e}")
999
+
1000
+ def _edit_local_agent(self, args) -> CommandResult:
1001
+ """Edit a local agent template."""
1002
+ try:
1003
+ agent_id = getattr(args, "agent_id", None)
1004
+ if not agent_id:
1005
+ return CommandResult.error_result("agent_id is required")
1006
+
1007
+ import os
1008
+ import subprocess
1009
+
1010
+ from ...services.agents.local_template_manager import (
1011
+ LocalAgentTemplateManager,
1012
+ )
1013
+
1014
+ manager = LocalAgentTemplateManager()
1015
+ template = manager.get_local_template(agent_id)
1016
+
1017
+ if not template:
1018
+ return CommandResult.error_result(f"Local agent '{agent_id}' not found")
1019
+
1020
+ # Get template file path
1021
+ template_file = None
1022
+ if template.tier == "project":
1023
+ template_file = manager.project_agents_dir / f"{agent_id}.json"
1024
+ else:
1025
+ template_file = manager.user_agents_dir / f"{agent_id}.json"
1026
+
1027
+ if not template_file or not template_file.exists():
1028
+ return CommandResult.error_result(
1029
+ f"Template file not found for '{agent_id}'"
1030
+ )
1031
+
1032
+ if getattr(args, "interactive", False):
1033
+ # Launch interactive editor
1034
+ from ..interactive.agent_wizard import AgentWizard
1035
+
1036
+ wizard = AgentWizard()
1037
+ success, message = wizard._edit_agent_config(template)
1038
+ if success:
1039
+ return CommandResult.success_result(message)
1040
+ return CommandResult.error_result(message)
1041
+
1042
+ # Use system editor
1043
+ editor = getattr(args, "editor", None) or os.environ.get("EDITOR", "nano")
1044
+ subprocess.run([editor, str(template_file)], check=True)
1045
+ return CommandResult.success_result(
1046
+ f"Agent '{agent_id}' edited successfully"
1047
+ )
1048
+
1049
+ except subprocess.CalledProcessError:
1050
+ return CommandResult.error_result("Editor exited with error")
1051
+ except Exception as e:
1052
+ self.logger.error(f"Error editing local agent: {e}", exc_info=True)
1053
+ return CommandResult.error_result(f"Error editing local agent: {e}")
1054
+
1055
+ def _delete_local_agent(self, args) -> CommandResult:
1056
+ """Delete local agent templates."""
1057
+ try:
1058
+ agent_ids = getattr(args, "agent_ids", [])
1059
+ if not agent_ids:
1060
+ return CommandResult.error_result("No agent IDs specified")
1061
+
1062
+ from ...services.agents.local_template_manager import (
1063
+ LocalAgentTemplateManager,
1064
+ )
1065
+
1066
+ manager = LocalAgentTemplateManager()
1067
+ force = getattr(args, "force", False)
1068
+ keep_deployment = getattr(args, "keep_deployment", False)
1069
+ backup = getattr(args, "backup", False)
1070
+
1071
+ # Confirmation if not forced
1072
+ if not force:
1073
+ print(f"\nāš ļø This will delete {len(agent_ids)} agent(s):")
1074
+ for agent_id in agent_ids:
1075
+ print(f" - {agent_id}")
1076
+ confirm = input("\nAre you sure? [y/N]: ").strip().lower()
1077
+ if confirm not in ["y", "yes"]:
1078
+ return CommandResult.error_result("Deletion cancelled")
1079
+
1080
+ # Delete agents
1081
+ if len(agent_ids) == 1:
1082
+ result = manager.delete_local_template(
1083
+ agent_id=agent_ids[0],
1084
+ tier="all",
1085
+ delete_deployment=not keep_deployment,
1086
+ backup_first=backup,
1087
+ )
1088
+ if result["success"]:
1089
+ message = f"Successfully deleted agent '{agent_ids[0]}'"
1090
+ if result["backup_location"]:
1091
+ message += f"\nBackup saved to: {result['backup_location']}"
1092
+ return CommandResult.success_result(message, data=result)
1093
+ return CommandResult.error_result(
1094
+ f"Failed to delete agent: {', '.join(result['errors'])}"
1095
+ )
1096
+ results = manager.delete_multiple_templates(
1097
+ agent_ids=agent_ids,
1098
+ tier="all",
1099
+ delete_deployment=not keep_deployment,
1100
+ backup_first=backup,
1101
+ )
1102
+
1103
+ message = ""
1104
+ if results["successful"]:
1105
+ message = (
1106
+ f"Successfully deleted {len(results['successful'])} agent(s):\n"
1107
+ )
1108
+ for agent_id in results["successful"]:
1109
+ message += f" - {agent_id}\n"
1110
+
1111
+ if results["failed"]:
1112
+ if message:
1113
+ message += "\n"
1114
+ message += f"Failed to delete {len(results['failed'])} agent(s):\n"
1115
+ for agent_id in results["failed"]:
1116
+ errors = results["details"][agent_id]["errors"]
1117
+ message += f" - {agent_id}: {', '.join(errors)}\n"
1118
+
1119
+ if results["successful"]:
1120
+ return CommandResult.success_result(message.strip(), data=results)
1121
+ return CommandResult.error_result(message.strip(), data=results)
1122
+
1123
+ except Exception as e:
1124
+ self.logger.error(f"Error deleting local agents: {e}", exc_info=True)
1125
+ return CommandResult.error_result(f"Error deleting local agents: {e}")
1126
+
1127
+ def _manage_local_agents(self, args) -> CommandResult:
1128
+ """Launch interactive management menu for local agents."""
1129
+ try:
1130
+ from ..interactive.agent_wizard import run_interactive_agent_manager
1131
+
1132
+ exit_code = run_interactive_agent_manager()
1133
+ if exit_code == 0:
1134
+ return CommandResult.success_result("Agent management completed")
1135
+ return CommandResult.error_result("Agent management failed or cancelled")
1136
+
1137
+ except Exception as e:
1138
+ self.logger.error(f"Error managing local agents: {e}", exc_info=True)
1139
+ return CommandResult.error_result(f"Error managing local agents: {e}")
1140
+
1141
+ def _configure_deployment(self, args) -> CommandResult:
1142
+ """Configure agent deployment settings."""
1143
+ try:
1144
+ from pathlib import Path
1145
+
1146
+ import yaml
1147
+
1148
+ from claude_mpm.core.config import Config
1149
+
1150
+ config = Config()
1151
+ config_path = Path.cwd() / ".claude-mpm" / "configuration.yaml"
1152
+
1153
+ # Handle show command
1154
+ if getattr(args, "show", False):
1155
+ from ...services.agents.deployment.deployment_config_loader import (
1156
+ DeploymentConfigLoader,
1157
+ )
1158
+
1159
+ loader = DeploymentConfigLoader(self.logger)
1160
+ settings = loader.get_deployment_settings(config)
1161
+
1162
+ print("\nšŸ“‹ Agent Deployment Configuration")
1163
+ print("=" * 50)
1164
+ print(f"Configuration file: {config_path}")
1165
+ print("\nšŸ”§ Deployment Settings:")
1166
+ print(f" Deploy system agents: {settings['deploy_system_agents']}")
1167
+ print(f" Deploy local agents: {settings['deploy_local_agents']}")
1168
+ print(f" Deploy user agents: {settings['deploy_user_agents']}")
1169
+ print(
1170
+ f" Prefer local over system: {settings['prefer_local_over_system']}"
1171
+ )
1172
+ print(f" Version comparison: {settings['version_comparison']}")
1173
+
1174
+ if settings["enabled_agents"]:
1175
+ print(
1176
+ f"\nāœ… Enabled agents: {', '.join(settings['enabled_agents'])}"
1177
+ )
1178
+ else:
1179
+ print("\nāœ… Enabled agents: All (no restrictions)")
1180
+
1181
+ if settings["disabled_agents"]:
1182
+ print(
1183
+ f"āŒ Disabled agents: {', '.join(settings['disabled_agents'])}"
1184
+ )
1185
+ else:
1186
+ print("āŒ Disabled agents: None")
1187
+
1188
+ print("\n" + "=" * 50)
1189
+ return CommandResult.success_result(
1190
+ "Displayed deployment configuration"
1191
+ )
1192
+
1193
+ # Handle interactive mode
1194
+ if getattr(args, "interactive", False):
1195
+ return self._configure_deployment_interactive(config_path)
1196
+
1197
+ # Load current configuration
1198
+ if not config_path.exists():
1199
+ config_path.parent.mkdir(parents=True, exist_ok=True)
1200
+ config_data = {}
1201
+ else:
1202
+ with config_path.open() as f:
1203
+ config_data = yaml.safe_load(f) or {}
1204
+
1205
+ # Ensure agent_deployment section exists
1206
+ if "agent_deployment" not in config_data:
1207
+ config_data["agent_deployment"] = {}
1208
+
1209
+ modified = False
1210
+
1211
+ # Handle enable/disable operations
1212
+ if getattr(args, "enable_all", False):
1213
+ config_data["agent_deployment"]["enabled_agents"] = []
1214
+ config_data["agent_deployment"]["disabled_agents"] = []
1215
+ print("āœ… Enabled all agents for deployment")
1216
+ modified = True
1217
+
1218
+ if getattr(args, "enable_system", False):
1219
+ config_data["agent_deployment"]["deploy_system_agents"] = True
1220
+ print("āœ… Enabled system agents for deployment")
1221
+ modified = True
1222
+
1223
+ if getattr(args, "disable_system", False):
1224
+ config_data["agent_deployment"]["deploy_system_agents"] = False
1225
+ print("āŒ Disabled system agents from deployment")
1226
+ modified = True
1227
+
1228
+ if getattr(args, "enable_local", False):
1229
+ config_data["agent_deployment"]["deploy_local_agents"] = True
1230
+ print("āœ… Enabled local agents for deployment")
1231
+ modified = True
1232
+
1233
+ if getattr(args, "disable_local", False):
1234
+ config_data["agent_deployment"]["deploy_local_agents"] = False
1235
+ print("āŒ Disabled local agents from deployment")
1236
+ modified = True
1237
+
1238
+ if getattr(args, "enable", None):
1239
+ enabled = config_data["agent_deployment"].get("enabled_agents", [])
1240
+ disabled = config_data["agent_deployment"].get("disabled_agents", [])
1241
+
1242
+ for agent_id in args.enable:
1243
+ if agent_id not in enabled:
1244
+ enabled.append(agent_id)
1245
+ if agent_id in disabled:
1246
+ disabled.remove(agent_id)
1247
+
1248
+ config_data["agent_deployment"]["enabled_agents"] = enabled
1249
+ config_data["agent_deployment"]["disabled_agents"] = disabled
1250
+ print(f"āœ… Enabled agents: {', '.join(args.enable)}")
1251
+ modified = True
1252
+
1253
+ if getattr(args, "disable", None):
1254
+ disabled = config_data["agent_deployment"].get("disabled_agents", [])
1255
+
1256
+ for agent_id in args.disable:
1257
+ if agent_id not in disabled:
1258
+ disabled.append(agent_id)
1259
+
1260
+ config_data["agent_deployment"]["disabled_agents"] = disabled
1261
+ print(f"āŒ Disabled agents: {', '.join(args.disable)}")
1262
+ modified = True
1263
+
1264
+ # Save configuration if modified
1265
+ if modified:
1266
+ with config_path.open("w") as f:
1267
+ yaml.dump(config_data, f, default_flow_style=False, sort_keys=False)
1268
+ print(f"\nšŸ’¾ Configuration saved to {config_path}")
1269
+ return CommandResult.success_result("Deployment configuration updated")
1270
+
1271
+ # If no modifications were made and not showing, display help
1272
+ if not getattr(args, "show", False):
1273
+ print("No configuration changes specified. Use --help for options.")
1274
+ return CommandResult.success_result("No changes made")
1275
+
1276
+ except Exception as e:
1277
+ self.logger.error(f"Error configuring deployment: {e}", exc_info=True)
1278
+ return CommandResult.error_result(f"Error configuring deployment: {e}")
1279
+
1280
+ def _configure_deployment_interactive(self, config_path: Path) -> CommandResult:
1281
+ """Interactive mode for configuring agent deployment."""
1282
+ try:
1283
+ import yaml
1284
+
1285
+ from ...utils.ui_helpers import (
1286
+ prompt_choice,
1287
+ prompt_multiselect,
1288
+ prompt_yes_no,
1289
+ )
1290
+
1291
+ # Load current configuration
1292
+ if config_path.exists():
1293
+ with config_path.open() as f:
1294
+ config_data = yaml.safe_load(f) or {}
1295
+ else:
1296
+ config_data = {}
1297
+
1298
+ if "agent_deployment" not in config_data:
1299
+ config_data["agent_deployment"] = {}
1300
+
1301
+ settings = config_data["agent_deployment"]
1302
+
1303
+ print("\nšŸŽ® Interactive Agent Deployment Configuration")
1304
+ print("=" * 50)
1305
+
1306
+ # Configure source types
1307
+ settings["deploy_system_agents"] = prompt_yes_no(
1308
+ "Deploy system agents?",
1309
+ default=settings.get("deploy_system_agents", True),
1310
+ )
1311
+
1312
+ settings["deploy_local_agents"] = prompt_yes_no(
1313
+ "Deploy local project agents?",
1314
+ default=settings.get("deploy_local_agents", True),
1315
+ )
1316
+
1317
+ settings["deploy_user_agents"] = prompt_yes_no(
1318
+ "Deploy user-level agents?",
1319
+ default=settings.get("deploy_user_agents", True),
1320
+ )
1321
+
1322
+ # Configure version behavior
1323
+ settings["prefer_local_over_system"] = prompt_yes_no(
1324
+ "Should local agents override system agents with same ID?",
1325
+ default=settings.get("prefer_local_over_system", True),
1326
+ )
1327
+
1328
+ settings["version_comparison"] = prompt_yes_no(
1329
+ "Compare versions across sources and deploy highest?",
1330
+ default=settings.get("version_comparison", True),
1331
+ )
1332
+
1333
+ # Configure specific agents
1334
+ choice = prompt_choice(
1335
+ "How would you like to configure specific agents?",
1336
+ [
1337
+ "No restrictions (all agents enabled)",
1338
+ "Specify disabled agents",
1339
+ "Specify enabled agents only",
1340
+ ],
1341
+ )
1342
+
1343
+ if choice == "No restrictions (all agents enabled)":
1344
+ settings["enabled_agents"] = []
1345
+ settings["disabled_agents"] = []
1346
+ elif choice == "Specify disabled agents":
1347
+ # Get list of available agents
1348
+ from ...services.agents.listing_service import AgentListingService
1349
+
1350
+ listing_service = AgentListingService()
1351
+ agents, _ = listing_service.list_all_agents()
1352
+ agent_ids = sorted({agent.name for agent in agents})
1353
+
1354
+ if agent_ids:
1355
+ disabled = prompt_multiselect(
1356
+ "Select agents to disable:",
1357
+ agent_ids,
1358
+ default=settings.get("disabled_agents", []),
1359
+ )
1360
+ settings["disabled_agents"] = disabled
1361
+ settings["enabled_agents"] = []
1362
+ else:
1363
+ print("No agents found to configure")
1364
+ else: # Specify enabled agents only
1365
+ from ...services.agents.listing_service import AgentListingService
1366
+
1367
+ listing_service = AgentListingService()
1368
+ agents, _ = listing_service.list_all_agents()
1369
+ agent_ids = sorted({agent.name for agent in agents})
1370
+
1371
+ if agent_ids:
1372
+ enabled = prompt_multiselect(
1373
+ "Select agents to enable (others will be disabled):",
1374
+ agent_ids,
1375
+ default=settings.get("enabled_agents", []),
1376
+ )
1377
+ settings["enabled_agents"] = enabled
1378
+ settings["disabled_agents"] = []
1379
+ else:
1380
+ print("No agents found to configure")
1381
+
1382
+ # Save configuration
1383
+ config_data["agent_deployment"] = settings
1384
+
1385
+ # Ensure parent directory exists
1386
+ config_path.parent.mkdir(parents=True, exist_ok=True)
1387
+
1388
+ with config_path.open("w") as f:
1389
+ yaml.dump(config_data, f, default_flow_style=False, sort_keys=False)
1390
+
1391
+ print(f"\nāœ… Configuration saved to {config_path}")
1392
+
1393
+ # Show summary
1394
+ print("\nšŸ“‹ New Configuration Summary:")
1395
+ print(
1396
+ f" System agents: {'Enabled' if settings.get('deploy_system_agents', True) else 'Disabled'}"
1397
+ )
1398
+ print(
1399
+ f" Local agents: {'Enabled' if settings.get('deploy_local_agents', True) else 'Disabled'}"
1400
+ )
1401
+ print(
1402
+ f" User agents: {'Enabled' if settings.get('deploy_user_agents', True) else 'Disabled'}"
1403
+ )
1404
+
1405
+ if settings.get("enabled_agents"):
1406
+ print(f" Enabled specific: {', '.join(settings['enabled_agents'])}")
1407
+ elif settings.get("disabled_agents"):
1408
+ print(f" Disabled specific: {', '.join(settings['disabled_agents'])}")
1409
+ else:
1410
+ print(" All agents enabled")
1411
+
1412
+ return CommandResult.success_result("Interactive configuration completed")
1413
+
1414
+ except KeyboardInterrupt:
1415
+ print("\n\nConfiguration cancelled.")
1416
+ return CommandResult.error_result("Configuration cancelled by user")
1417
+ except Exception as e:
1418
+ self.logger.error(f"Error in interactive configuration: {e}", exc_info=True)
1419
+ return CommandResult.error_result(
1420
+ f"Error in interactive configuration: {e}"
1421
+ )
1422
+
1423
+ def _detect_toolchain(self, args) -> CommandResult:
1424
+ """Detect project toolchain without deploying agents.
1425
+
1426
+ Part of TSK-0054 Phase 5: Auto-configuration CLI integration.
1427
+ """
1428
+ try:
1429
+ from .agents_detect import AgentsDetectCommand
1430
+
1431
+ cmd = AgentsDetectCommand()
1432
+ return cmd.run(args)
1433
+ except Exception as e:
1434
+ self.logger.error(f"Error detecting toolchain: {e}", exc_info=True)
1435
+ return CommandResult.error_result(f"Error detecting toolchain: {e}")
1436
+
1437
+ def _recommend_agents(self, args) -> CommandResult:
1438
+ """Recommend agents based on project toolchain.
1439
+
1440
+ Part of TSK-0054 Phase 5: Auto-configuration CLI integration.
1441
+ """
1442
+ try:
1443
+ from .agents_recommend import AgentsRecommendCommand
1444
+
1445
+ cmd = AgentsRecommendCommand()
1446
+ return cmd.run(args)
1447
+ except Exception as e:
1448
+ self.logger.error(f"Error recommending agents: {e}", exc_info=True)
1449
+ return CommandResult.error_result(f"Error recommending agents: {e}")
1450
+
879
1451
 
880
1452
  def manage_agents(args):
881
1453
  """
@@ -887,7 +1459,7 @@ def manage_agents(args):
887
1459
  result = command.execute(args)
888
1460
 
889
1461
  # Print result if structured output format is requested
890
- if hasattr(args, "format") and args.format in ["json", "yaml"]:
1462
+ if _is_structured_output(args):
891
1463
  command.print_result(result, args)
892
1464
 
893
1465
  return result.exit_code