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

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

Potentially problematic release.


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

Files changed (517) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +69 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +37 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +1128 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +935 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  41. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  42. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  43. claude_mpm/cli/commands/postmortem.py +401 -0
  44. claude_mpm/cli/commands/run.py +125 -167
  45. claude_mpm/cli/commands/skill_source.py +694 -0
  46. claude_mpm/cli/commands/skills.py +757 -20
  47. claude_mpm/cli/executor.py +78 -3
  48. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  49. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  50. claude_mpm/cli/parsers/agents_parser.py +310 -4
  51. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  52. claude_mpm/cli/parsers/base_parser.py +53 -0
  53. claude_mpm/cli/parsers/config_parser.py +96 -43
  54. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  55. claude_mpm/cli/parsers/skills_parser.py +145 -0
  56. claude_mpm/cli/parsers/source_parser.py +138 -0
  57. claude_mpm/cli/startup.py +564 -108
  58. claude_mpm/cli/startup_display.py +480 -0
  59. claude_mpm/cli/utils.py +1 -1
  60. claude_mpm/cli_module/commands.py +1 -1
  61. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  62. claude_mpm/commands/mpm-agents-detect.md +9 -0
  63. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  64. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  65. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  66. claude_mpm/commands/mpm-doctor.md +9 -0
  67. claude_mpm/commands/mpm-help.md +14 -2
  68. claude_mpm/commands/mpm-init.md +27 -2
  69. claude_mpm/commands/mpm-monitor.md +9 -0
  70. claude_mpm/commands/mpm-postmortem.md +123 -0
  71. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  72. claude_mpm/commands/mpm-status.md +9 -0
  73. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  74. claude_mpm/commands/mpm-ticket-view.md +552 -0
  75. claude_mpm/commands/mpm-version.md +9 -0
  76. claude_mpm/commands/mpm.md +10 -0
  77. claude_mpm/config/agent_presets.py +488 -0
  78. claude_mpm/config/agent_sources.py +325 -0
  79. claude_mpm/config/skill_presets.py +392 -0
  80. claude_mpm/config/skill_sources.py +590 -0
  81. claude_mpm/constants.py +13 -0
  82. claude_mpm/core/api_validator.py +1 -1
  83. claude_mpm/core/claude_runner.py +19 -35
  84. claude_mpm/core/config.py +24 -0
  85. claude_mpm/core/constants.py +1 -1
  86. claude_mpm/core/framework/__init__.py +3 -16
  87. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  88. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  89. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  90. claude_mpm/core/hook_error_memory.py +381 -0
  91. claude_mpm/core/hook_manager.py +41 -2
  92. claude_mpm/core/interactive_session.py +131 -10
  93. claude_mpm/core/logger.py +3 -1
  94. claude_mpm/core/oneshot_session.py +110 -8
  95. claude_mpm/core/output_style_manager.py +173 -43
  96. claude_mpm/core/protocols/__init__.py +23 -0
  97. claude_mpm/core/protocols/runner_protocol.py +103 -0
  98. claude_mpm/core/protocols/session_protocol.py +131 -0
  99. claude_mpm/core/shared/singleton_manager.py +11 -4
  100. claude_mpm/core/system_context.py +38 -0
  101. claude_mpm/core/unified_agent_registry.py +129 -1
  102. claude_mpm/core/unified_config.py +22 -0
  103. claude_mpm/dashboard/static/css/activity.css +69 -69
  104. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  105. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  106. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  107. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  108. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  109. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  110. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  111. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  112. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  113. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  114. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  115. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  116. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  117. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  118. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  119. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  120. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  121. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  122. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  123. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  124. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  125. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  126. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  127. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  128. claude_mpm/dashboard/templates/code_simple.html +23 -23
  129. claude_mpm/dashboard/templates/index.html +18 -18
  130. claude_mpm/experimental/cli_enhancements.py +1 -5
  131. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  132. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  133. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  134. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  135. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  136. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  137. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  139. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  140. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  141. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  142. claude_mpm/models/agent_definition.py +7 -0
  143. claude_mpm/models/git_repository.py +198 -0
  144. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  145. claude_mpm/scripts/start_activity_logging.py +3 -1
  146. claude_mpm/services/agents/agent_builder.py +45 -9
  147. claude_mpm/services/agents/agent_preset_service.py +238 -0
  148. claude_mpm/services/agents/agent_selection_service.py +484 -0
  149. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  150. claude_mpm/services/agents/cache_git_manager.py +621 -0
  151. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  152. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  153. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  154. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  155. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  156. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  157. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  158. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  159. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  160. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  161. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +225 -18
  162. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  163. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  164. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +557 -0
  165. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  166. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  167. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  168. claude_mpm/services/agents/git_source_manager.py +629 -0
  169. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  170. claude_mpm/services/agents/local_template_manager.py +50 -10
  171. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  172. claude_mpm/services/agents/sources/__init__.py +13 -0
  173. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  174. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  175. claude_mpm/services/agents/startup_sync.py +239 -0
  176. claude_mpm/services/agents/toolchain_detector.py +474 -0
  177. claude_mpm/services/analysis/__init__.py +25 -0
  178. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  179. claude_mpm/services/analysis/postmortem_service.py +765 -0
  180. claude_mpm/services/cli/session_pause_manager.py +1 -1
  181. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  182. claude_mpm/services/command_deployment_service.py +200 -6
  183. claude_mpm/services/core/base.py +7 -2
  184. claude_mpm/services/core/interfaces/__init__.py +1 -3
  185. claude_mpm/services/core/interfaces/health.py +1 -4
  186. claude_mpm/services/core/models/__init__.py +2 -11
  187. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  188. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  189. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  190. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  191. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  192. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  193. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  194. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  195. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  196. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  197. claude_mpm/services/event_bus/direct_relay.py +3 -3
  198. claude_mpm/services/event_bus/event_bus.py +36 -3
  199. claude_mpm/services/events/consumers/logging.py +1 -2
  200. claude_mpm/services/git/__init__.py +21 -0
  201. claude_mpm/services/git/git_operations_service.py +494 -0
  202. claude_mpm/services/github/__init__.py +21 -0
  203. claude_mpm/services/github/github_cli_service.py +397 -0
  204. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  205. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  206. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  207. claude_mpm/services/instructions/__init__.py +9 -0
  208. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  209. claude_mpm/services/local_ops/__init__.py +3 -13
  210. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  211. claude_mpm/services/local_ops/health_manager.py +1 -4
  212. claude_mpm/services/local_ops/process_manager.py +1 -1
  213. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  214. claude_mpm/services/mcp_config_manager.py +75 -145
  215. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  216. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  217. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  218. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  219. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  220. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  221. claude_mpm/services/mcp_service_verifier.py +6 -3
  222. claude_mpm/services/memory/optimizer.py +1 -1
  223. claude_mpm/services/model/model_router.py +8 -9
  224. claude_mpm/services/monitor/daemon.py +29 -9
  225. claude_mpm/services/monitor/daemon_manager.py +96 -19
  226. claude_mpm/services/monitor/server.py +2 -2
  227. claude_mpm/services/native_agent_converter.py +356 -0
  228. claude_mpm/services/port_manager.py +1 -1
  229. claude_mpm/services/pr/__init__.py +14 -0
  230. claude_mpm/services/pr/pr_template_service.py +329 -0
  231. claude_mpm/services/project/documentation_manager.py +2 -1
  232. claude_mpm/services/project/project_organizer.py +4 -0
  233. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  234. claude_mpm/services/runner_configuration_service.py +17 -3
  235. claude_mpm/services/self_upgrade_service.py +165 -7
  236. claude_mpm/services/session_management_service.py +16 -4
  237. claude_mpm/services/skills/__init__.py +18 -0
  238. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  239. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  240. claude_mpm/services/skills_config.py +547 -0
  241. claude_mpm/services/skills_deployer.py +955 -0
  242. claude_mpm/services/socketio/handlers/connection.py +1 -1
  243. claude_mpm/services/socketio/handlers/git.py +2 -2
  244. claude_mpm/services/socketio/server/core.py +1 -4
  245. claude_mpm/services/socketio/server/main.py +1 -3
  246. claude_mpm/services/system_instructions_service.py +1 -3
  247. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  248. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  249. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  250. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  251. claude_mpm/services/unified/unified_deployment.py +1 -5
  252. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  253. claude_mpm/services/visualization/__init__.py +1 -5
  254. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  255. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  256. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  257. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  258. claude_mpm/skills/skills_registry.py +0 -1
  259. claude_mpm/templates/questions/__init__.py +38 -0
  260. claude_mpm/templates/questions/base.py +193 -0
  261. claude_mpm/templates/questions/pr_strategy.py +311 -0
  262. claude_mpm/templates/questions/project_init.py +385 -0
  263. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  264. claude_mpm/tools/__main__.py +8 -8
  265. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  266. claude_mpm/utils/agent_dependency_loader.py +80 -13
  267. claude_mpm/utils/agent_filters.py +288 -0
  268. claude_mpm/utils/dependency_cache.py +3 -1
  269. claude_mpm/utils/gitignore.py +244 -0
  270. claude_mpm/utils/log_cleanup.py +3 -3
  271. claude_mpm/utils/migration.py +372 -0
  272. claude_mpm/utils/progress.py +387 -0
  273. claude_mpm/utils/robust_installer.py +3 -5
  274. claude_mpm/utils/structured_questions.py +619 -0
  275. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
  276. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
  277. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  278. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  279. claude_mpm/agents/templates/agent-manager.json +0 -273
  280. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  281. claude_mpm/agents/templates/api_qa.json +0 -180
  282. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  283. claude_mpm/agents/templates/clerk-ops.json +0 -235
  284. claude_mpm/agents/templates/code_analyzer.json +0 -101
  285. claude_mpm/agents/templates/content-agent.json +0 -358
  286. claude_mpm/agents/templates/dart_engineer.json +0 -307
  287. claude_mpm/agents/templates/data_engineer.json +0 -225
  288. claude_mpm/agents/templates/documentation.json +0 -211
  289. claude_mpm/agents/templates/engineer.json +0 -210
  290. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  291. claude_mpm/agents/templates/golang_engineer.json +0 -270
  292. claude_mpm/agents/templates/imagemagick.json +0 -264
  293. claude_mpm/agents/templates/java_engineer.json +0 -346
  294. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  295. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  296. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  297. claude_mpm/agents/templates/memory_manager.json +0 -158
  298. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  299. claude_mpm/agents/templates/ops.json +0 -185
  300. claude_mpm/agents/templates/php-engineer.json +0 -287
  301. claude_mpm/agents/templates/product_owner.json +0 -338
  302. claude_mpm/agents/templates/project_organizer.json +0 -140
  303. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  304. claude_mpm/agents/templates/python_engineer.json +0 -387
  305. claude_mpm/agents/templates/qa.json +0 -242
  306. claude_mpm/agents/templates/react_engineer.json +0 -238
  307. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  308. claude_mpm/agents/templates/research.json +0 -188
  309. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  310. claude_mpm/agents/templates/rust_engineer.json +0 -275
  311. claude_mpm/agents/templates/security.json +0 -202
  312. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  313. claude_mpm/agents/templates/ticketing.json +0 -177
  314. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  315. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  316. claude_mpm/agents/templates/version_control.json +0 -157
  317. claude_mpm/agents/templates/web_qa.json +0 -399
  318. claude_mpm/agents/templates/web_ui.json +0 -189
  319. claude_mpm/commands/mpm-tickets.md +0 -102
  320. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  321. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  322. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  323. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  324. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  325. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  326. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  327. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  328. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  329. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  330. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  331. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  332. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  333. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  334. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  335. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  336. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  337. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  338. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  339. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  340. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  341. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  342. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  343. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  344. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  345. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  346. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  347. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  348. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  349. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  350. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  351. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  352. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  353. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  354. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  355. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  357. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  358. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  359. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  366. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  367. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  368. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  369. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  370. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  371. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  372. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  373. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  374. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  375. claude_mpm/dashboard/static/built/react/events.js +0 -30
  376. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  377. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  378. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  379. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  380. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  381. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  382. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  383. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  384. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  385. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  388. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  389. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  390. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  391. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  392. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  393. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  394. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  395. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  396. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  397. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  398. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  399. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  400. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  401. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  402. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  403. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  404. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  405. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  406. claude_mpm/dashboard/static/events.html +0 -607
  407. claude_mpm/dashboard/static/index.html +0 -635
  408. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  409. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  410. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  411. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  412. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  413. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  414. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  415. claude_mpm/dashboard/static/legacy/files.html +0 -747
  416. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  417. claude_mpm/dashboard/static/monitors.html +0 -431
  418. claude_mpm/dashboard/static/production/events.html +0 -659
  419. claude_mpm/dashboard/static/production/main.html +0 -698
  420. claude_mpm/dashboard/static/production/monitors.html +0 -483
  421. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  422. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  423. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  424. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  425. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  426. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  427. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  428. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  429. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  430. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  431. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  432. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  433. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  434. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  435. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  436. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  437. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  438. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  439. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  440. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  441. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  442. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  443. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  444. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  445. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  446. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  447. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  448. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  449. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  450. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  451. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  452. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  453. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  454. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  455. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  456. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  457. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  458. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  459. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  460. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  461. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  462. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  463. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  464. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  465. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  466. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  467. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  468. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  469. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  470. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  471. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  472. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  473. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  474. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  475. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  476. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  477. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  478. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  479. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  480. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  481. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  482. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  483. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  484. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  485. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  486. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  487. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  488. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  489. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  490. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  491. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  492. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  493. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  494. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  495. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  496. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  497. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  498. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  499. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  500. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  501. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  502. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  503. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  504. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  505. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  506. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  507. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  508. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  509. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  510. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  511. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  512. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  513. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  514. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
  515. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
  516. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
  517. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/top_level.txt +0 -0
claude_mpm/cli/startup.py CHANGED
@@ -10,6 +10,47 @@ Part of cli/__init__.py refactoring to reduce file size and improve modularity.
10
10
 
11
11
  import os
12
12
  import sys
13
+ import warnings
14
+ from pathlib import Path
15
+
16
+
17
+ def check_legacy_cache() -> None:
18
+ """Check for legacy cache/agents/ directory and warn user.
19
+
20
+ WHY: cache/agents/ is deprecated in favor of cache/remote-agents/.
21
+ Research confirmed that cache/remote-agents/ is the canonical location
22
+ with 26 active code references, while cache/agents/ has only 7 legacy references.
23
+
24
+ DESIGN DECISIONS:
25
+ - Non-blocking warning: Doesn't stop execution, just informs user
26
+ - Migration guidance: Provides clear path to migrate
27
+ - One-time check: Only warns if legacy cache contains files
28
+ """
29
+ home = Path.home()
30
+ legacy_cache = home / ".claude-mpm" / "cache" / "agents"
31
+ canonical_cache = home / ".claude-mpm" / "cache" / "remote-agents"
32
+ migration_marker = home / ".claude-mpm" / "cache" / ".migrated_to_remote_agents"
33
+
34
+ # Skip if already migrated or no legacy cache
35
+ if migration_marker.exists() or not legacy_cache.exists():
36
+ return
37
+
38
+ # Check if legacy cache has actual agent files
39
+ legacy_files = list(legacy_cache.glob("*.md")) + list(legacy_cache.glob("*.json"))
40
+ if not legacy_files:
41
+ return
42
+
43
+ # Only warn if canonical cache doesn't exist (indicating unmigrated system)
44
+ if not canonical_cache.exists():
45
+ warnings.warn(
46
+ f"\n⚠️ DEPRECATION: Legacy cache directory detected\n"
47
+ f" Location: {legacy_cache}\n"
48
+ f" Files found: {len(legacy_files)}\n\n"
49
+ f"The 'cache/agents/' directory is deprecated. Please migrate to 'cache/remote-agents/'.\n"
50
+ f"Run: python scripts/migrate_cache_to_remote_agents.py\n",
51
+ DeprecationWarning,
52
+ stacklevel=2,
53
+ )
13
54
 
14
55
 
15
56
  def setup_early_environment(argv):
@@ -19,23 +60,34 @@ def setup_early_environment(argv):
19
60
  WHY: Some commands need special environment handling before any logging
20
61
  or service initialization occurs.
21
62
 
63
+ CRITICAL: Suppress ALL logging by default until setup_mcp_server_logging()
64
+ configures the user's preference. This prevents early loggers (like
65
+ ProjectInitializer and service.* loggers) from logging at INFO level before
66
+ we know the user's logging preference.
67
+
22
68
  Args:
23
69
  argv: Command line arguments
24
70
 
25
71
  Returns:
26
72
  Processed argv list
27
73
  """
74
+ import logging
75
+
28
76
  # Disable telemetry and set cleanup flags early
29
77
  os.environ.setdefault("DISABLE_TELEMETRY", "1")
30
78
  os.environ.setdefault("CLAUDE_MPM_SKIP_CLEANUP", "0")
31
79
 
32
- # EARLY CHECK: Suppress logging for configure command
80
+ # CRITICAL: Suppress ALL logging by default
81
+ # This catches all loggers (claude_mpm.*, service.*, framework_loader, etc.)
82
+ # This will be overridden by setup_mcp_server_logging() based on user preference
83
+ logging.getLogger().setLevel(logging.CRITICAL + 1) # Root logger catches everything
84
+
85
+ # Process argv
33
86
  if argv is None:
34
87
  argv = sys.argv[1:]
35
- if "configure" in argv or (len(argv) > 0 and argv[0] == "configure"):
36
- import logging
37
88
 
38
- logging.getLogger("claude_mpm").setLevel(logging.WARNING)
89
+ # EARLY CHECK: Additional suppression for configure command
90
+ if "configure" in argv or (len(argv) > 0 and argv[0] == "configure"):
39
91
  os.environ["CLAUDE_MPM_SKIP_CLEANUP"] = "1"
40
92
 
41
93
  return argv
@@ -86,7 +138,7 @@ def deploy_bundled_skills():
86
138
  WHY: Automatically deploy skills from the bundled/ directory to .claude/skills/
87
139
  to ensure skills are available for agents without manual intervention.
88
140
 
89
- DESIGN DECISION: Deployment happens silently on startup with logging only.
141
+ DESIGN DECISION: Deployment happens with minimal feedback (checkmark on success).
90
142
  Failures are logged but don't block startup to ensure claude-mpm remains
91
143
  functional even if skills deployment fails. Respects auto_deploy config setting.
92
144
  """
@@ -117,9 +169,13 @@ def deploy_bundled_skills():
117
169
  logger = get_logger("cli")
118
170
 
119
171
  if deployment_result.get("deployed"):
120
- logger.info(
121
- f"Skills: Deployed {len(deployment_result['deployed'])} skill(s)"
122
- )
172
+ # Show simple feedback for deployed skills
173
+ deployed_count = len(deployment_result["deployed"])
174
+ print(f"✓ Bundled skills ready ({deployed_count} deployed)", flush=True)
175
+ logger.info(f"Skills: Deployed {deployed_count} skill(s)")
176
+ elif not deployment_result.get("errors"):
177
+ # No deployment needed, skills already present
178
+ print("✓ Bundled skills ready", flush=True)
123
179
 
124
180
  if deployment_result.get("errors"):
125
181
  logger.warning(
@@ -142,7 +198,8 @@ def discover_and_link_runtime_skills():
142
198
  WHY: Automatically discover and link skills added to .claude/skills/
143
199
  without requiring manual configuration.
144
200
 
145
- DESIGN DECISION: Failures are logged but don't block startup to ensure
201
+ DESIGN DECISION: Provides simple feedback on completion.
202
+ Failures are logged but don't block startup to ensure
146
203
  claude-mpm remains functional even if skills discovery fails.
147
204
  """
148
205
  try:
@@ -151,6 +208,8 @@ def discover_and_link_runtime_skills():
151
208
  )
152
209
 
153
210
  discover_skills()
211
+ # Show simple success feedback
212
+ print("✓ Runtime skills linked", flush=True)
154
213
  except Exception as e:
155
214
  # Import logger here to avoid circular imports
156
215
  from ..core.logger import get_logger
@@ -160,18 +219,459 @@ def discover_and_link_runtime_skills():
160
219
  # Continue execution - skills discovery failure shouldn't block startup
161
220
 
162
221
 
222
+ def deploy_output_style_on_startup():
223
+ """
224
+ Deploy claude-mpm output style to Claude Code on CLI startup.
225
+
226
+ WHY: Automatically deploy and activate the output style to ensure consistent,
227
+ professional communication without emojis and exclamation points. This ensures
228
+ the style is available even when using Claude Code directly (not via chat command).
229
+
230
+ DESIGN DECISION: This is non-blocking and idempotent. It uses OutputStyleManager
231
+ which handles version detection, file deployment, and settings activation.
232
+ Only works for Claude Code >= 1.0.83.
233
+ """
234
+ try:
235
+ from pathlib import Path
236
+
237
+ from ..core.output_style_manager import OutputStyleManager
238
+
239
+ # Create OutputStyleManager instance
240
+ output_style_manager = OutputStyleManager()
241
+
242
+ # Check if Claude Code supports output styles
243
+ if not output_style_manager.supports_output_styles():
244
+ # Silently skip - version too old or Claude not installed
245
+ return
246
+
247
+ # Check if already deployed and active
248
+ settings_file = Path.home() / ".claude" / "settings.json"
249
+ output_style_file = Path.home() / ".claude" / "output-styles" / "claude-mpm.md"
250
+
251
+ already_configured = False
252
+ if settings_file.exists() and output_style_file.exists():
253
+ try:
254
+ import json
255
+
256
+ # Check if file has content (bug fix: was skipping empty files)
257
+ if output_style_file.stat().st_size == 0:
258
+ # File is empty, need to redeploy with content
259
+ pass # Fall through to deployment below
260
+ else:
261
+ # File has content, check if already active
262
+ settings = json.loads(settings_file.read_text())
263
+ if settings.get("activeOutputStyle") == "claude-mpm":
264
+ # Already deployed and active with content
265
+ already_configured = True
266
+ except Exception:
267
+ pass # Continue with deployment if we can't read settings
268
+
269
+ if already_configured:
270
+ # Show feedback that output style is ready
271
+ print("✓ Output style configured", flush=True)
272
+ return
273
+
274
+ # Read OUTPUT_STYLE.md content
275
+ output_style_path = Path(__file__).parent.parent / "agents" / "OUTPUT_STYLE.md"
276
+
277
+ if not output_style_path.exists():
278
+ # No output style file to deploy
279
+ return
280
+
281
+ output_style_content = output_style_path.read_text()
282
+
283
+ # Deploy the output style (deploys file and activates it)
284
+ output_style_manager.deploy_output_style(output_style_content)
285
+ print("✓ Output style configured", flush=True)
286
+
287
+ except Exception as e:
288
+ # Non-critical - log but don't fail startup
289
+ from ..core.logger import get_logger
290
+
291
+ logger = get_logger("cli")
292
+ logger.debug(f"Failed to deploy output style: {e}")
293
+ # Continue execution - output style deployment shouldn't block startup
294
+
295
+
296
+ def sync_remote_agents_on_startup():
297
+ """
298
+ Synchronize agent templates from remote sources on startup.
299
+
300
+ WHY: Ensures agents are up-to-date from remote Git sources (GitHub)
301
+ without manual intervention. Uses ETag-based caching for efficient
302
+ updates (95%+ bandwidth reduction).
303
+
304
+ DESIGN DECISION: Non-blocking synchronization that doesn't prevent
305
+ startup if network is unavailable. Failures are logged but don't
306
+ block startup to ensure claude-mpm remains functional.
307
+
308
+ Workflow:
309
+ 1. Sync all enabled Git sources (download/cache files) - Phase 1 progress bar
310
+ 2. Deploy agents to ~/.claude/agents/ - Phase 2 progress bar
311
+ 3. Log deployment results
312
+ """
313
+ # Check for legacy cache and warn user if found
314
+ check_legacy_cache()
315
+
316
+ try:
317
+ from ..services.agents.deployment.agent_deployment import AgentDeploymentService
318
+ from ..services.agents.startup_sync import sync_agents_on_startup
319
+ from ..utils.progress import ProgressBar
320
+
321
+ # Phase 1: Sync files from Git sources
322
+ result = sync_agents_on_startup()
323
+
324
+ # Only proceed with deployment if sync was enabled and ran
325
+ if result.get("enabled") and result.get("sources_synced", 0) > 0:
326
+ from ..core.logger import get_logger
327
+
328
+ logger = get_logger("cli")
329
+
330
+ downloaded = result.get("total_downloaded", 0)
331
+ cached = result.get("cache_hits", 0)
332
+ duration = result.get("duration_ms", 0)
333
+
334
+ if downloaded > 0 or cached > 0:
335
+ logger.debug(
336
+ f"Agent sync: {downloaded} updated, {cached} cached ({duration}ms)"
337
+ )
338
+
339
+ # Log errors if any
340
+ errors = result.get("errors", [])
341
+ if errors:
342
+ logger.warning(f"Agent sync completed with {len(errors)} errors")
343
+
344
+ # Phase 2: Deploy agents from cache to ~/.claude/agents/
345
+ # This mirrors the skills deployment pattern (lines 371-407)
346
+ try:
347
+ # Initialize deployment service
348
+ deployment_service = AgentDeploymentService()
349
+
350
+ # Count agents in cache to show accurate progress
351
+ from pathlib import Path
352
+
353
+ cache_dir = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
354
+ agent_count = 0
355
+
356
+ if cache_dir.exists():
357
+ # Count MD files in cache (agent markdown files from Git)
358
+ # BUGFIX: Only count files in agent directories, not docs/templates/READMEs
359
+ # Valid agent paths must contain "/agents/" or be in root-level category dirs
360
+ # Exclude PM templates, BASE-AGENT, and documentation files
361
+ pm_templates = {
362
+ "base-agent.md",
363
+ "circuit_breakers.md",
364
+ "pm_examples.md",
365
+ "pm_red_flags.md",
366
+ "research_gate_examples.md",
367
+ "response_format.md",
368
+ "ticket_completeness_examples.md",
369
+ "validation_templates.md",
370
+ "git_file_tracking.md",
371
+ }
372
+ # Documentation files to exclude (by filename)
373
+ doc_files = {
374
+ "readme.md",
375
+ "changelog.md",
376
+ "contributing.md",
377
+ "implementation-summary.md",
378
+ "reorganization-plan.md",
379
+ "auto-deploy-index.md",
380
+ }
381
+
382
+ # Find all markdown files
383
+ all_md_files = list(cache_dir.rglob("*.md"))
384
+
385
+ # Filter to only agent files:
386
+ # 1. Must have "/agents/" in path (from git repos)
387
+ # 2. Must not be in PM templates or doc files
388
+ # 3. Exclude BASE-AGENT.md which is not a deployable agent
389
+ agent_files = [
390
+ f
391
+ for f in all_md_files
392
+ if (
393
+ # Must be in an agent directory (from git repos like bobmatnyc/claude-mpm-agents/agents/)
394
+ "/agents/" in str(f)
395
+ # Exclude PM templates, doc files, and BASE-AGENT
396
+ and f.name.lower() not in pm_templates
397
+ and f.name.lower() not in doc_files
398
+ and f.name.lower() != "base-agent.md"
399
+ )
400
+ ]
401
+ agent_count = len(agent_files)
402
+
403
+ if agent_count > 0:
404
+ # Create progress bar for deployment phase
405
+ deploy_progress = ProgressBar(
406
+ total=agent_count,
407
+ prefix="Deploying agents",
408
+ show_percentage=True,
409
+ show_counter=True,
410
+ )
411
+
412
+ # Deploy agents with progress callback
413
+ deploy_target = Path.home() / ".claude" / "agents"
414
+ deployment_result = deployment_service.deploy_agents(
415
+ target_dir=deploy_target,
416
+ force_rebuild=False, # Only deploy if versions differ
417
+ deployment_mode="update", # Version-aware updates
418
+ )
419
+
420
+ # Update progress bar (single increment since deploy_agents is batch)
421
+ deploy_progress.update(agent_count)
422
+
423
+ # Finish deployment progress bar
424
+ deployed = len(deployment_result.get("deployed", []))
425
+ updated = len(deployment_result.get("updated", []))
426
+ skipped = len(deployment_result.get("skipped", []))
427
+ total_available = deployed + updated + skipped
428
+
429
+ # Show total available agents (deployed + updated + already existing)
430
+ if deployed > 0 or updated > 0:
431
+ deploy_progress.finish(
432
+ f"Complete: {deployed} deployed, {updated} updated, {skipped} already present ({total_available} total)"
433
+ )
434
+ else:
435
+ deploy_progress.finish(
436
+ f"Complete: {total_available} agents ready (all up-to-date)"
437
+ )
438
+
439
+ # Display deployment errors to user (not just logs)
440
+ deploy_errors = deployment_result.get("errors", [])
441
+ if deploy_errors:
442
+ # Log for debugging
443
+ logger.warning(
444
+ f"Agent deployment completed with {len(deploy_errors)} errors: {deploy_errors}"
445
+ )
446
+
447
+ # Display errors to user with clear formatting
448
+ print("\n⚠️ Agent Deployment Errors:")
449
+
450
+ # Show first 10 errors to avoid overwhelming output
451
+ max_errors_to_show = 10
452
+ errors_to_display = deploy_errors[:max_errors_to_show]
453
+
454
+ for error in errors_to_display:
455
+ # Format error message for readability
456
+ # Errors typically come as strings like "agent.md: Error message"
457
+ print(f" - {error}")
458
+
459
+ # If more errors exist, show count
460
+ if len(deploy_errors) > max_errors_to_show:
461
+ remaining = len(deploy_errors) - max_errors_to_show
462
+ print(f" ... and {remaining} more error(s)")
463
+
464
+ # Show summary message
465
+ print(
466
+ f"\n❌ Failed to deploy {len(deploy_errors)} agent(s). Please check the error messages above."
467
+ )
468
+ print(" Run with --verbose for detailed error information.\n")
469
+
470
+ except Exception as e:
471
+ # Deployment failure shouldn't block startup
472
+ from ..core.logger import get_logger
473
+
474
+ logger = get_logger("cli")
475
+ logger.warning(f"Failed to deploy agents from cache: {e}")
476
+
477
+ except Exception as e:
478
+ # Non-critical - log but don't fail startup
479
+ from ..core.logger import get_logger
480
+
481
+ logger = get_logger("cli")
482
+ logger.debug(f"Failed to sync remote agents: {e}")
483
+ # Continue execution - agent sync failure shouldn't block startup
484
+
485
+
486
+ def sync_remote_skills_on_startup():
487
+ """
488
+ Synchronize skill templates from remote sources on startup.
489
+
490
+ WHY: Ensures skills are up-to-date from remote Git sources (GitHub)
491
+ without manual intervention. Provides consistency with agent syncing.
492
+
493
+ DESIGN DECISION: Non-blocking synchronization that doesn't prevent
494
+ startup if network is unavailable. Failures are logged but don't
495
+ block startup to ensure claude-mpm remains functional.
496
+
497
+ Workflow:
498
+ 1. Sync all enabled Git sources (download/cache files) - Phase 1 progress bar
499
+ 2. Deploy skills to ~/.claude/skills/ with flat structure - Phase 2 progress bar
500
+ 3. Log deployment results
501
+ """
502
+ try:
503
+ from pathlib import Path
504
+
505
+ from ..config.skill_sources import SkillSourceConfiguration
506
+ from ..services.skills.git_skill_source_manager import GitSkillSourceManager
507
+ from ..utils.progress import ProgressBar
508
+
509
+ config = SkillSourceConfiguration()
510
+ manager = GitSkillSourceManager(config)
511
+
512
+ # Get enabled sources
513
+ enabled_sources = config.get_enabled_sources()
514
+ if not enabled_sources:
515
+ return # No sources enabled, nothing to sync
516
+
517
+ # Phase 1: Sync files from Git sources
518
+ # We need to discover file count first to show accurate progress
519
+ # This requires pre-scanning repositories via GitHub API
520
+ from ..core.logger import get_logger
521
+
522
+ logger = get_logger("cli")
523
+
524
+ # Discover total file count across all sources
525
+ total_file_count = 0
526
+ for source in enabled_sources:
527
+ try:
528
+ # Parse GitHub URL
529
+ url_parts = (
530
+ source.url.rstrip("/").replace(".git", "").split("github.com/")
531
+ )
532
+ if len(url_parts) == 2:
533
+ repo_path = url_parts[1].strip("/")
534
+ owner_repo = "/".join(repo_path.split("/")[:2])
535
+
536
+ # Use Tree API to discover all files
537
+ all_files = manager._discover_repository_files_via_tree_api(
538
+ owner_repo, source.branch
539
+ )
540
+
541
+ # Count relevant files (markdown, JSON)
542
+ relevant_files = [
543
+ f
544
+ for f in all_files
545
+ if f.endswith(".md") or f.endswith(".json") or f == ".gitignore"
546
+ ]
547
+ total_file_count += len(relevant_files)
548
+
549
+ except Exception as e:
550
+ logger.debug(f"Failed to discover files for {source.id}: {e}")
551
+ # Use estimate if discovery fails
552
+ total_file_count += 150
553
+
554
+ # Create progress bar for sync phase with actual file count
555
+ sync_progress = ProgressBar(
556
+ total=total_file_count if total_file_count > 0 else 1,
557
+ prefix="Syncing skills",
558
+ show_percentage=True,
559
+ show_counter=True,
560
+ )
561
+
562
+ # Sync all sources with progress callback
563
+ results = manager.sync_all_sources(
564
+ force=False, progress_callback=sync_progress.update
565
+ )
566
+
567
+ # Finish sync progress bar with clear breakdown
568
+ downloaded = results["total_files_updated"]
569
+ cached = results["total_files_cached"]
570
+ total_files = downloaded + cached
571
+
572
+ if cached > 0:
573
+ sync_progress.finish(
574
+ f"Complete: {downloaded} downloaded, {cached} cached ({total_files} total)"
575
+ )
576
+ else:
577
+ # All new downloads (first sync)
578
+ sync_progress.finish(f"Complete: {downloaded} files downloaded")
579
+
580
+ # Phase 2: Deploy skills to ~/.claude/skills/
581
+ # This flattens nested Git structure (e.g., collaboration/parallel-agents/SKILL.md)
582
+ # into flat deployment (e.g., collaboration-dispatching-parallel-agents/SKILL.md)
583
+ if results["synced_count"] > 0:
584
+ # Get all skills to determine deployment count
585
+ all_skills = manager.get_all_skills()
586
+ skill_count = len(all_skills)
587
+
588
+ if skill_count > 0:
589
+ # Create progress bar for deployment phase
590
+ deploy_progress = ProgressBar(
591
+ total=skill_count,
592
+ prefix="Deploying skill directories",
593
+ show_percentage=True,
594
+ show_counter=True,
595
+ )
596
+
597
+ # Deploy skills with progress callback
598
+ # Deploy to project directory (like agents), not user directory
599
+ deployment_result = manager.deploy_skills(
600
+ target_dir=Path.cwd() / ".claude" / "skills",
601
+ force=False,
602
+ progress_callback=deploy_progress.update,
603
+ )
604
+
605
+ # Finish deployment progress bar
606
+ deployed = deployment_result.get("deployed_count", 0)
607
+ skipped = deployment_result.get("skipped_count", 0)
608
+ total_available = deployed + skipped
609
+
610
+ # Show total available skills (deployed + already existing)
611
+ # This is more user-friendly than just showing newly deployed count
612
+ if deployed > 0:
613
+ deploy_progress.finish(
614
+ f"Complete: {deployed} deployed, {skipped} already present ({total_available} total)"
615
+ )
616
+ else:
617
+ deploy_progress.finish(
618
+ f"Complete: {total_available} skills ready (all up-to-date)"
619
+ )
620
+
621
+ # Log deployment errors if any
622
+ from ..core.logger import get_logger
623
+
624
+ logger = get_logger("cli")
625
+
626
+ errors = deployment_result.get("errors", [])
627
+ if errors:
628
+ logger.warning(
629
+ f"Skill deployment completed with {len(errors)} errors: {errors}"
630
+ )
631
+
632
+ # Log sync errors if any
633
+ if results["failed_count"] > 0:
634
+ logger.warning(
635
+ f"Skill sync completed with {results['failed_count']} failures"
636
+ )
637
+
638
+ except Exception as e:
639
+ # Non-critical - log but don't fail startup
640
+ from ..core.logger import get_logger
641
+
642
+ logger = get_logger("cli")
643
+ logger.debug(f"Failed to sync remote skills: {e}")
644
+ # Continue execution - skill sync failure shouldn't block startup
645
+
646
+
163
647
  def run_background_services():
164
648
  """
165
649
  Initialize all background services on startup.
166
650
 
167
651
  WHY: Centralizes all startup service initialization for cleaner main().
652
+
653
+ NOTE: System instructions (PM_INSTRUCTIONS.md, WORKFLOW.md, MEMORY.md) and
654
+ templates do NOT deploy automatically on startup. They only deploy when user
655
+ explicitly requests them via agent-manager commands. This prevents unwanted
656
+ file creation in project .claude/ directories.
657
+ See: SystemInstructionsDeployer and agent_deployment.py line 504-509
168
658
  """
169
659
  initialize_project_registry()
170
660
  check_mcp_auto_configuration()
171
661
  verify_mcp_gateway_startup()
172
662
  check_for_updates_async()
173
- deploy_bundled_skills()
174
- discover_and_link_runtime_skills()
663
+ sync_remote_agents_on_startup() # Sync agents from remote sources
664
+
665
+ # Skills deployment order (precedence: remote > bundled)
666
+ # 1. Deploy bundled skills first (base layer from package)
667
+ # 2. Sync and deploy remote skills (Git sources, can override bundled)
668
+ # 3. Discover and link runtime skills (user-added skills)
669
+ # This ensures remote skills take precedence over bundled skills when names conflict
670
+ deploy_bundled_skills() # Base layer: package-bundled skills
671
+ sync_remote_skills_on_startup() # Override layer: Git-based skills (takes precedence)
672
+ discover_and_link_runtime_skills() # Discovery: user-added skills
673
+
674
+ deploy_output_style_on_startup()
175
675
 
176
676
 
177
677
  def setup_mcp_server_logging(args):
@@ -247,12 +747,26 @@ def check_mcp_auto_configuration():
247
747
  user consent.
248
748
 
249
749
  DESIGN DECISION: This is blocking but quick - it only runs once and has
250
- a 10-second timeout. We want to catch users on first run for the best
251
- experience.
750
+ a 10-second timeout. Shows progress feedback during checks to avoid
751
+ appearing frozen.
752
+
753
+ OPTIMIZATION: Skip ALL MCP checks for doctor and configure commands to avoid
754
+ duplicate checks (doctor performs its own comprehensive check, configure
755
+ allows users to select services).
252
756
  """
757
+ # Skip MCP service checks for the doctor and configure commands
758
+ # The doctor command performs its own comprehensive MCP service check
759
+ # The configure command allows users to configure which services to enable
760
+ # Running both would cause duplicate checks and log messages (9 seconds apart)
761
+ if len(sys.argv) > 1 and sys.argv[1] in ("doctor", "configure"):
762
+ return
763
+
253
764
  try:
254
765
  from ..services.mcp_gateway.auto_configure import check_and_configure_mcp
255
766
 
767
+ # Show progress feedback - this operation can take 10+ seconds
768
+ print("Checking MCP configuration...", end="", flush=True)
769
+
256
770
  # This function handles all the logic:
257
771
  # - Checks if already configured
258
772
  # - Checks if pipx installation
@@ -261,45 +775,18 @@ def check_mcp_auto_configuration():
261
775
  # - Configures if user agrees
262
776
  check_and_configure_mcp()
263
777
 
264
- except Exception as e:
265
- # Non-critical - log but don't fail
266
- from ..core.logger import get_logger
267
-
268
- logger = get_logger("cli")
269
- logger.debug(f"MCP auto-configuration check failed: {e}")
270
-
271
- # Skip MCP service fixes for the doctor and configure commands
272
- # The doctor command performs its own comprehensive MCP service check
273
- # The configure command allows users to configure which services to enable
274
- # Running both would cause duplicate checks and log messages (9 seconds apart)
275
- if len(sys.argv) > 1 and sys.argv[1] in ("doctor", "configure"):
276
- return
277
-
278
- # Also ensure MCP services are properly configured in ~/.claude.json
279
- # This fixes incorrect paths and adds missing services
280
- try:
281
- from ..core.logger import get_logger
282
- from ..services.mcp_config_manager import MCPConfigManager
283
-
284
- logger = get_logger("cli")
285
- mcp_manager = MCPConfigManager()
286
-
287
- # Fix any corrupted installations first
288
- fix_success, fix_message = mcp_manager.fix_mcp_service_issues()
289
- if fix_message and "Fixed:" in fix_message:
290
- logger.info(f"MCP service fixes applied: {fix_message}")
291
-
292
- # Ensure all services are configured correctly
293
- config_success, config_message = mcp_manager.ensure_mcp_services_configured()
294
- if config_message and "Added MCP services" in config_message:
295
- logger.info(f"MCP services configured: {config_message}")
778
+ # Clear the "Checking..." message by overwriting with spaces
779
+ print("\r" + " " * 30 + "\r", end="", flush=True)
296
780
 
297
781
  except Exception as e:
782
+ # Clear progress message on error
783
+ print("\r" + " " * 30 + "\r", end="", flush=True)
784
+
298
785
  # Non-critical - log but don't fail
299
786
  from ..core.logger import get_logger
300
787
 
301
788
  logger = get_logger("cli")
302
- logger.debug(f"MCP services configuration update failed: {e}")
789
+ logger.debug(f"MCP auto-configuration check failed: {e}")
303
790
 
304
791
 
305
792
  def verify_mcp_gateway_startup():
@@ -328,7 +815,6 @@ def verify_mcp_gateway_startup():
328
815
 
329
816
  try:
330
817
  import asyncio
331
- import time
332
818
 
333
819
  from ..core.logger import get_logger
334
820
  from ..services.mcp_gateway.core.startup_verification import (
@@ -343,68 +829,14 @@ def verify_mcp_gateway_startup():
343
829
 
344
830
  # DISABLED: Pre-warming MCP servers can interfere with Claude Code's MCP management
345
831
  # This was causing issues with MCP server initialization and stderr handling
346
- # def run_pre_warming():
347
- # loop = None
348
- # try:
349
- # start_time = time.time()
350
- # loop = asyncio.new_event_loop()
351
- # asyncio.set_event_loop(loop)
352
- #
353
- # # Pre-warm MCP servers (especially vector search)
354
- # logger.info("Pre-warming MCP servers to eliminate startup delay...")
355
- # loop.run_until_complete(pre_warm_mcp_servers())
356
- #
357
- # pre_warm_time = time.time() - start_time
358
- # if pre_warm_time > 1.0:
359
- # logger.info(f"MCP servers pre-warmed in {pre_warm_time:.2f}s")
360
-
361
- # Dummy function to maintain structure
362
- def run_pre_warming():
363
- loop = None
364
- try:
365
- time.time()
366
- loop = asyncio.new_event_loop()
367
- asyncio.set_event_loop(loop)
368
-
369
- # Also run gateway verification if needed
370
- if not gateway_configured:
371
- loop.run_until_complete(verify_mcp_gateway_on_startup())
372
-
373
- except Exception as e:
374
- # Non-blocking - log but don't fail
375
- logger.debug(f"MCP pre-warming error (non-critical): {e}")
376
- finally:
377
- # Properly clean up event loop to prevent kqueue warnings
378
- if loop is not None:
379
- try:
380
- # Cancel all running tasks
381
- pending = asyncio.all_tasks(loop)
382
- for task in pending:
383
- task.cancel()
384
- # Wait for tasks to complete cancellation
385
- if pending:
386
- loop.run_until_complete(
387
- asyncio.gather(*pending, return_exceptions=True)
388
- )
389
- except Exception:
390
- pass # Ignore cleanup errors
391
- finally:
392
- loop.close()
393
- # Clear the event loop reference to help with cleanup
394
- asyncio.set_event_loop(None)
395
-
396
- # Run pre-warming in background thread
397
- import threading
398
-
399
- pre_warm_thread = threading.Thread(target=run_pre_warming, daemon=True)
400
- pre_warm_thread.start()
832
+ # Pre-warming functionality has been removed. Gateway verification only runs
833
+ # if MCP gateway is not already configured.
401
834
 
402
- return
403
-
404
- # Run detailed verification in background if not configured
835
+ # Run gateway verification in background if not configured
405
836
  if not gateway_configured:
406
- # Note: We don't await this to avoid blocking startup
837
+
407
838
  def run_verification():
839
+ """Background thread to verify MCP gateway configuration."""
408
840
  loop = None
409
841
  try:
410
842
  loop = asyncio.new_event_loop()
@@ -471,7 +903,7 @@ def check_for_updates_async():
471
903
 
472
904
  DESIGN DECISION: This is non-blocking and non-critical - failures are logged
473
905
  but don't prevent startup. Only runs for pip/pipx/npm installations, skips
474
- editable/development installations.
906
+ editable/development installations. Respects user configuration settings.
475
907
  """
476
908
 
477
909
  def run_update_check():
@@ -480,11 +912,27 @@ def check_for_updates_async():
480
912
  try:
481
913
  import asyncio
482
914
 
915
+ from ..core.config import Config
483
916
  from ..core.logger import get_logger
484
917
  from ..services.self_upgrade_service import SelfUpgradeService
485
918
 
486
919
  logger = get_logger("upgrade_check")
487
920
 
921
+ # Load configuration
922
+ config = Config()
923
+ updates_config = config.get("updates", {})
924
+
925
+ # Check if update checking is enabled
926
+ if not updates_config.get("check_enabled", True):
927
+ logger.debug("Update checking disabled in configuration")
928
+ return
929
+
930
+ # Check frequency setting
931
+ frequency = updates_config.get("check_frequency", "daily")
932
+ if frequency == "never":
933
+ logger.debug("Update checking frequency set to 'never'")
934
+ return
935
+
488
936
  # Create new event loop for this thread
489
937
  loop = asyncio.new_event_loop()
490
938
  asyncio.set_event_loop(loop)
@@ -499,8 +947,16 @@ def check_for_updates_async():
499
947
  logger.debug("Skipping version check for editable installation")
500
948
  return
501
949
 
950
+ # Get configuration values
951
+ check_claude_code = updates_config.get("check_claude_code", True)
952
+ auto_upgrade = updates_config.get("auto_upgrade", False)
953
+
502
954
  # Check and prompt for upgrade if available (non-blocking)
503
- loop.run_until_complete(upgrade_service.check_and_prompt_on_startup())
955
+ loop.run_until_complete(
956
+ upgrade_service.check_and_prompt_on_startup(
957
+ auto_upgrade=auto_upgrade, check_claude_code=check_claude_code
958
+ )
959
+ )
504
960
 
505
961
  except Exception as e:
506
962
  # Non-critical - log but don't fail startup