claude-mpm 4.1.26__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 (845) 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 +420 -158
  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/OUTPUT_STYLE.md +299 -29
  13. claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
  14. claude_mpm/agents/WORKFLOW.md +355 -191
  15. claude_mpm/agents/agent_loader.py +40 -10
  16. claude_mpm/agents/agent_loader_integration.py +3 -2
  17. claude_mpm/agents/async_agent_loader.py +3 -3
  18. claude_mpm/agents/base_agent_loader.py +11 -9
  19. claude_mpm/agents/frontmatter_validator.py +291 -251
  20. claude_mpm/agents/system_agent_config.py +3 -2
  21. claude_mpm/agents/templates/README.md +465 -0
  22. claude_mpm/agents/templates/agent-manager.json +7 -4
  23. claude_mpm/agents/templates/{agentic_coder_optimizer.json → agentic-coder-optimizer.json} +33 -7
  24. claude_mpm/agents/templates/api_qa.json +16 -4
  25. claude_mpm/agents/templates/circuit_breakers.md +638 -0
  26. claude_mpm/agents/templates/clerk-ops.json +235 -0
  27. claude_mpm/agents/templates/code_analyzer.json +10 -4
  28. claude_mpm/agents/templates/content-agent.json +358 -0
  29. claude_mpm/agents/templates/dart_engineer.json +307 -0
  30. claude_mpm/agents/templates/data_engineer.json +87 -14
  31. claude_mpm/agents/templates/documentation.json +76 -13
  32. claude_mpm/agents/templates/engineer.json +43 -9
  33. claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
  34. claude_mpm/agents/templates/git_file_tracking.md +584 -0
  35. claude_mpm/agents/templates/golang_engineer.json +270 -0
  36. claude_mpm/agents/templates/imagemagick.json +5 -2
  37. claude_mpm/agents/templates/java_engineer.json +346 -0
  38. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  39. claude_mpm/agents/templates/local_ops_agent.json +1840 -0
  40. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
  41. claude_mpm/agents/templates/memory_manager.json +6 -3
  42. claude_mpm/agents/templates/nextjs_engineer.json +285 -0
  43. claude_mpm/agents/templates/ops.json +14 -4
  44. claude_mpm/agents/templates/php-engineer.json +287 -0
  45. claude_mpm/agents/templates/pm_examples.md +474 -0
  46. claude_mpm/agents/templates/pm_red_flags.md +262 -0
  47. claude_mpm/agents/templates/product_owner.json +338 -0
  48. claude_mpm/agents/templates/project_organizer.json +19 -5
  49. claude_mpm/agents/templates/prompt-engineer.json +737 -0
  50. claude_mpm/agents/templates/python_engineer.json +387 -0
  51. claude_mpm/agents/templates/qa.json +25 -5
  52. claude_mpm/agents/templates/react_engineer.json +239 -0
  53. claude_mpm/agents/templates/refactoring_engineer.json +15 -5
  54. claude_mpm/agents/templates/research.json +46 -21
  55. claude_mpm/agents/templates/response_format.md +583 -0
  56. claude_mpm/agents/templates/ruby-engineer.json +280 -0
  57. claude_mpm/agents/templates/rust_engineer.json +275 -0
  58. claude_mpm/agents/templates/security.json +59 -10
  59. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  60. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  61. claude_mpm/agents/templates/ticketing.json +16 -7
  62. claude_mpm/agents/templates/typescript_engineer.json +285 -0
  63. claude_mpm/agents/templates/validation_templates.md +312 -0
  64. claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
  65. claude_mpm/agents/templates/version_control.json +16 -4
  66. claude_mpm/agents/templates/web_qa.json +167 -21
  67. claude_mpm/agents/templates/web_ui.json +18 -5
  68. claude_mpm/cli/__init__.py +38 -378
  69. claude_mpm/cli/commands/__init__.py +2 -0
  70. claude_mpm/cli/commands/agent_manager.py +675 -20
  71. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  72. claude_mpm/cli/commands/agents.py +722 -150
  73. claude_mpm/cli/commands/agents_detect.py +380 -0
  74. claude_mpm/cli/commands/agents_recommend.py +309 -0
  75. claude_mpm/cli/commands/aggregate.py +10 -6
  76. claude_mpm/cli/commands/analyze.py +15 -10
  77. claude_mpm/cli/commands/analyze_code.py +8 -4
  78. claude_mpm/cli/commands/auto_configure.py +570 -0
  79. claude_mpm/cli/commands/cleanup.py +12 -12
  80. claude_mpm/cli/commands/config.py +47 -13
  81. claude_mpm/cli/commands/configure.py +469 -1064
  82. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  83. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  84. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  85. claude_mpm/cli/commands/configure_models.py +18 -0
  86. claude_mpm/cli/commands/configure_navigation.py +167 -0
  87. claude_mpm/cli/commands/configure_paths.py +104 -0
  88. claude_mpm/cli/commands/configure_persistence.py +254 -0
  89. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  90. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  91. claude_mpm/cli/commands/configure_validators.py +73 -0
  92. claude_mpm/cli/commands/dashboard.py +50 -52
  93. claude_mpm/cli/commands/debug.py +7 -7
  94. claude_mpm/cli/commands/doctor.py +43 -7
  95. claude_mpm/cli/commands/info.py +3 -4
  96. claude_mpm/cli/commands/local_deploy.py +537 -0
  97. claude_mpm/cli/commands/mcp.py +17 -10
  98. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  99. claude_mpm/cli/commands/mcp_config.py +154 -0
  100. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  101. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  102. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  103. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  104. claude_mpm/cli/commands/memory.py +55 -21
  105. claude_mpm/cli/commands/monitor.py +160 -70
  106. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  107. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  108. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  109. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  110. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  111. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  112. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  113. claude_mpm/cli/commands/mpm_init_handler.py +114 -4
  114. claude_mpm/cli/commands/run.py +169 -42
  115. claude_mpm/cli/commands/search.py +458 -0
  116. claude_mpm/cli/commands/skills.py +488 -0
  117. claude_mpm/cli/commands/uninstall.py +176 -0
  118. claude_mpm/cli/commands/upgrade.py +152 -0
  119. claude_mpm/cli/commands/verify.py +119 -0
  120. claude_mpm/cli/executor.py +204 -0
  121. claude_mpm/cli/helpers.py +105 -0
  122. claude_mpm/cli/interactive/__init__.py +21 -0
  123. claude_mpm/cli/interactive/agent_wizard.py +962 -0
  124. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  125. claude_mpm/cli/parser.py +79 -2
  126. claude_mpm/cli/parsers/__init__.py +7 -1
  127. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  128. claude_mpm/cli/parsers/agents_parser.py +116 -0
  129. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  130. claude_mpm/cli/parsers/base_parser.py +143 -3
  131. claude_mpm/cli/parsers/configure_parser.py +11 -15
  132. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  133. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  134. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  135. claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
  136. claude_mpm/cli/parsers/run_parser.py +5 -0
  137. claude_mpm/cli/parsers/search_parser.py +245 -0
  138. claude_mpm/cli/parsers/skills_parser.py +137 -0
  139. claude_mpm/cli/shared/argument_patterns.py +20 -13
  140. claude_mpm/cli/shared/base_command.py +2 -2
  141. claude_mpm/cli/shared/output_formatters.py +28 -19
  142. claude_mpm/cli/startup.py +562 -0
  143. claude_mpm/cli/startup_logging.py +179 -13
  144. claude_mpm/cli/utils.py +53 -2
  145. claude_mpm/commands/mpm-agents-detect.md +168 -0
  146. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  147. claude_mpm/commands/mpm-agents.md +118 -8
  148. claude_mpm/commands/mpm-auto-configure.md +269 -0
  149. claude_mpm/commands/mpm-config.md +137 -14
  150. claude_mpm/commands/mpm-help.md +285 -5
  151. claude_mpm/commands/mpm-init.md +374 -15
  152. claude_mpm/commands/mpm-monitor.md +409 -0
  153. claude_mpm/commands/mpm-organize.md +295 -0
  154. claude_mpm/commands/mpm-resume.md +372 -0
  155. claude_mpm/commands/mpm-status.md +71 -9
  156. claude_mpm/commands/mpm-tickets.md +56 -7
  157. claude_mpm/commands/mpm-version.md +113 -0
  158. claude_mpm/commands/mpm.md +2 -0
  159. claude_mpm/config/agent_config.py +4 -4
  160. claude_mpm/config/experimental_features.py +7 -7
  161. claude_mpm/config/model_config.py +428 -0
  162. claude_mpm/config/paths.py +3 -2
  163. claude_mpm/config/socketio_config.py +3 -3
  164. claude_mpm/constants.py +15 -1
  165. claude_mpm/core/__init__.py +53 -17
  166. claude_mpm/core/agent_name_normalizer.py +3 -2
  167. claude_mpm/core/agent_registry.py +2 -2
  168. claude_mpm/core/agent_session_manager.py +10 -10
  169. claude_mpm/core/api_validator.py +330 -0
  170. claude_mpm/core/base_service.py +33 -23
  171. claude_mpm/core/cache.py +9 -9
  172. claude_mpm/core/claude_runner.py +19 -8
  173. claude_mpm/core/config.py +85 -8
  174. claude_mpm/core/config_aliases.py +7 -6
  175. claude_mpm/core/constants.py +65 -0
  176. claude_mpm/core/container.py +11 -5
  177. claude_mpm/core/enums.py +452 -0
  178. claude_mpm/core/error_handler.py +623 -0
  179. claude_mpm/core/factories.py +1 -1
  180. claude_mpm/core/file_utils.py +764 -0
  181. claude_mpm/core/framework/__init__.py +38 -0
  182. claude_mpm/core/framework/formatters/__init__.py +11 -0
  183. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  184. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  185. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  186. claude_mpm/core/framework/loaders/__init__.py +13 -0
  187. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  188. claude_mpm/core/framework/loaders/file_loader.py +223 -0
  189. claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
  190. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  191. claude_mpm/core/framework/processors/__init__.py +11 -0
  192. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  193. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  194. claude_mpm/core/framework/processors/template_processor.py +244 -0
  195. claude_mpm/core/framework_loader.py +321 -1631
  196. claude_mpm/core/hook_manager.py +8 -6
  197. claude_mpm/core/injectable_service.py +11 -8
  198. claude_mpm/core/instruction_reinforcement_hook.py +4 -3
  199. claude_mpm/core/interactive_session.py +55 -8
  200. claude_mpm/core/interfaces.py +56 -1
  201. claude_mpm/core/lazy.py +3 -3
  202. claude_mpm/core/log_manager.py +92 -23
  203. claude_mpm/core/logger.py +19 -14
  204. claude_mpm/core/logging_config.py +6 -2
  205. claude_mpm/core/logging_utils.py +520 -0
  206. claude_mpm/core/oneshot_session.py +51 -7
  207. claude_mpm/core/optimized_agent_loader.py +9 -9
  208. claude_mpm/core/optimized_startup.py +1 -1
  209. claude_mpm/core/output_style_manager.py +12 -192
  210. claude_mpm/core/pm_hook_interceptor.py +18 -12
  211. claude_mpm/core/service_registry.py +7 -3
  212. claude_mpm/core/session_manager.py +14 -12
  213. claude_mpm/core/shared/config_loader.py +1 -1
  214. claude_mpm/core/socketio_pool.py +15 -15
  215. claude_mpm/core/tool_access_control.py +3 -2
  216. claude_mpm/core/types.py +4 -11
  217. claude_mpm/core/typing_utils.py +7 -6
  218. claude_mpm/core/unified_agent_registry.py +115 -11
  219. claude_mpm/core/unified_config.py +6 -6
  220. claude_mpm/core/unified_paths.py +23 -20
  221. claude_mpm/dashboard/analysis_runner.py +4 -4
  222. claude_mpm/dashboard/api/simple_directory.py +261 -0
  223. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  224. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  225. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  226. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  227. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  228. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  229. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  230. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  231. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  232. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  233. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  234. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  235. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  236. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  237. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  238. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  239. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  240. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  241. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  242. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  243. claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
  244. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  245. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  246. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  247. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  248. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  249. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  250. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  251. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  252. claude_mpm/dashboard/static/built/components/code-tree.js +1 -1
  253. claude_mpm/dashboard/static/built/components/code-viewer.js +1 -1
  254. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  255. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  256. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  257. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  258. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  259. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  260. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  261. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  262. claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
  263. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  264. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  265. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  266. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  267. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +1 -1
  268. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  269. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  270. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  271. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  272. claude_mpm/dashboard/static/built/react/events.js +30 -0
  273. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  274. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  275. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  276. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  277. claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
  278. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  279. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  280. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  281. claude_mpm/dashboard/static/css/dashboard.css +588 -6
  282. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  283. claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
  284. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  285. claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
  286. claude_mpm/dashboard/static/dist/components/code-viewer.js +1 -1
  287. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  288. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  289. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  290. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  291. claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
  292. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  293. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  294. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
  295. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  296. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  297. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  298. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  299. claude_mpm/dashboard/static/events.html +607 -0
  300. claude_mpm/dashboard/static/index.html +635 -0
  301. claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
  302. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  303. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  304. claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
  305. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  306. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  307. claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
  308. claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
  309. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  310. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  311. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  312. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  313. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  314. claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
  315. claude_mpm/dashboard/static/js/components/session-manager.js +7 -7
  316. claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
  317. claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
  318. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +455 -23
  319. claude_mpm/dashboard/static/js/components/working-directory.js +44 -9
  320. claude_mpm/dashboard/static/js/dashboard.js +245 -132
  321. claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
  322. claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
  323. claude_mpm/dashboard/static/js/shared/logger.js +385 -0
  324. claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
  325. claude_mpm/dashboard/static/js/socket-client.js +49 -22
  326. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  327. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  328. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  329. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  330. claude_mpm/dashboard/static/legacy/files.html +747 -0
  331. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  332. claude_mpm/dashboard/static/monitors.html +431 -0
  333. claude_mpm/dashboard/static/production/events.html +659 -0
  334. claude_mpm/dashboard/static/production/main.html +698 -0
  335. claude_mpm/dashboard/static/production/monitors.html +483 -0
  336. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  337. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  338. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  339. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  340. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  341. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  342. claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
  343. claude_mpm/dashboard/templates/code_simple.html +153 -0
  344. claude_mpm/dashboard/templates/index.html +112 -109
  345. claude_mpm/experimental/cli_enhancements.py +4 -2
  346. claude_mpm/generators/agent_profile_generator.py +5 -3
  347. claude_mpm/hooks/__init__.py +37 -1
  348. claude_mpm/hooks/base_hook.py +5 -4
  349. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  350. claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
  351. claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
  352. claude_mpm/hooks/claude_hooks/installer.py +67 -22
  353. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  354. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  355. claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
  356. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  357. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  358. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  359. claude_mpm/hooks/failure_learning/__init__.py +60 -0
  360. claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
  361. claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
  362. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
  363. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  364. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  365. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  366. claude_mpm/hooks/kuzu_response_hook.py +183 -0
  367. claude_mpm/hooks/memory_integration_hook.py +1 -1
  368. claude_mpm/hooks/session_resume_hook.py +121 -0
  369. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  370. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  371. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  372. claude_mpm/hooks/validation_hooks.py +3 -3
  373. claude_mpm/init.py +23 -4
  374. claude_mpm/models/agent_session.py +8 -6
  375. claude_mpm/models/resume_log.py +340 -0
  376. claude_mpm/scripts/claude-hook-handler.sh +33 -7
  377. claude_mpm/scripts/launch_monitor.py +85 -0
  378. claude_mpm/scripts/mcp_server.py +3 -5
  379. claude_mpm/scripts/mpm_doctor.py +3 -2
  380. claude_mpm/scripts/socketio_daemon.py +159 -512
  381. claude_mpm/services/__init__.py +144 -160
  382. claude_mpm/services/agents/__init__.py +18 -5
  383. claude_mpm/services/agents/agent_builder.py +13 -11
  384. claude_mpm/services/agents/auto_config_manager.py +796 -0
  385. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  386. claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
  387. claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
  388. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  389. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  390. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
  391. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  392. claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
  393. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  394. claude_mpm/services/agents/deployment/agent_template_builder.py +715 -47
  395. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  396. claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
  397. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  398. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  399. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  400. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  401. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  402. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  403. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  404. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
  405. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  406. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  407. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  408. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  409. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  410. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  411. claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
  412. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  413. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  414. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  415. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  416. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  417. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
  418. claude_mpm/services/agents/local_template_manager.py +744 -0
  419. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  420. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  421. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  422. claude_mpm/services/agents/memory/content_manager.py +17 -9
  423. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  424. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  425. claude_mpm/services/agents/memory/memory_format_service.py +6 -4
  426. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  427. claude_mpm/services/agents/memory/template_generator.py +3 -3
  428. claude_mpm/services/agents/observers.py +547 -0
  429. claude_mpm/services/agents/recommender.py +615 -0
  430. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  431. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  432. claude_mpm/services/async_session_logger.py +141 -98
  433. claude_mpm/services/claude_session_logger.py +82 -74
  434. claude_mpm/services/cli/agent_cleanup_service.py +5 -0
  435. claude_mpm/services/cli/agent_listing_service.py +5 -5
  436. claude_mpm/services/cli/agent_validation_service.py +3 -1
  437. claude_mpm/services/cli/memory_crud_service.py +12 -7
  438. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  439. claude_mpm/services/cli/resume_service.py +617 -0
  440. claude_mpm/services/cli/session_manager.py +104 -13
  441. claude_mpm/services/cli/session_pause_manager.py +504 -0
  442. claude_mpm/services/cli/session_resume_helper.py +372 -0
  443. claude_mpm/services/cli/startup_checker.py +13 -10
  444. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  445. claude_mpm/services/command_deployment_service.py +9 -7
  446. claude_mpm/services/command_handler_service.py +11 -5
  447. claude_mpm/services/core/__init__.py +33 -1
  448. claude_mpm/services/core/base.py +26 -11
  449. claude_mpm/services/core/interfaces/__init__.py +90 -3
  450. claude_mpm/services/core/interfaces/agent.py +184 -0
  451. claude_mpm/services/core/interfaces/health.py +172 -0
  452. claude_mpm/services/core/interfaces/model.py +281 -0
  453. claude_mpm/services/core/interfaces/process.py +372 -0
  454. claude_mpm/services/core/interfaces/project.py +121 -0
  455. claude_mpm/services/core/interfaces/restart.py +307 -0
  456. claude_mpm/services/core/interfaces/stability.py +260 -0
  457. claude_mpm/services/core/interfaces.py +56 -1
  458. claude_mpm/services/core/memory_manager.py +92 -47
  459. claude_mpm/services/core/models/__init__.py +79 -0
  460. claude_mpm/services/core/models/agent_config.py +384 -0
  461. claude_mpm/services/core/models/health.py +162 -0
  462. claude_mpm/services/core/models/process.py +239 -0
  463. claude_mpm/services/core/models/restart.py +302 -0
  464. claude_mpm/services/core/models/stability.py +264 -0
  465. claude_mpm/services/core/models/toolchain.py +306 -0
  466. claude_mpm/services/core/path_resolver.py +36 -14
  467. claude_mpm/services/diagnostics/__init__.py +2 -2
  468. claude_mpm/services/diagnostics/checks/__init__.py +4 -2
  469. claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
  470. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  471. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  472. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  473. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  474. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  475. claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
  476. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
  477. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
  478. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
  479. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  480. claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
  481. claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
  482. claude_mpm/services/diagnostics/models.py +37 -21
  483. claude_mpm/services/event_aggregator.py +5 -3
  484. claude_mpm/services/event_bus/direct_relay.py +8 -4
  485. claude_mpm/services/event_bus/event_bus.py +51 -9
  486. claude_mpm/services/event_bus/relay.py +33 -14
  487. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  488. claude_mpm/services/events/core.py +5 -6
  489. claude_mpm/services/events/producers/hook.py +6 -6
  490. claude_mpm/services/events/producers/system.py +8 -8
  491. claude_mpm/services/exceptions.py +5 -5
  492. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  493. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  494. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  495. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  496. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  497. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  498. claude_mpm/services/hook_installer_service.py +506 -0
  499. claude_mpm/services/hook_service.py +5 -6
  500. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  501. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  502. claude_mpm/services/infrastructure/logging.py +2 -2
  503. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
  504. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  505. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  506. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  507. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  508. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  509. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  510. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  511. claude_mpm/services/local_ops/__init__.py +165 -0
  512. claude_mpm/services/local_ops/crash_detector.py +257 -0
  513. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  514. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  515. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  516. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  517. claude_mpm/services/local_ops/health_manager.py +430 -0
  518. claude_mpm/services/local_ops/log_monitor.py +396 -0
  519. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  520. claude_mpm/services/local_ops/process_manager.py +595 -0
  521. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  522. claude_mpm/services/local_ops/restart_manager.py +401 -0
  523. claude_mpm/services/local_ops/restart_policy.py +387 -0
  524. claude_mpm/services/local_ops/state_manager.py +372 -0
  525. claude_mpm/services/local_ops/unified_manager.py +600 -0
  526. claude_mpm/services/mcp_config_manager.py +1612 -0
  527. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  528. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  529. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  530. claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
  531. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  532. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  533. claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
  534. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  535. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  536. claude_mpm/services/mcp_gateway/main.py +90 -15
  537. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  538. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  539. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
  540. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
  541. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  542. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  543. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  544. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  545. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  546. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  547. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
  548. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  549. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  550. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  551. claude_mpm/services/mcp_service_verifier.py +729 -0
  552. claude_mpm/services/memory/builder.py +9 -8
  553. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  554. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  555. claude_mpm/services/memory/failure_tracker.py +578 -0
  556. claude_mpm/services/memory/indexed_memory.py +8 -8
  557. claude_mpm/services/memory/optimizer.py +8 -9
  558. claude_mpm/services/memory/router.py +3 -3
  559. claude_mpm/services/memory_hook_service.py +165 -4
  560. claude_mpm/services/model/__init__.py +147 -0
  561. claude_mpm/services/model/base_provider.py +365 -0
  562. claude_mpm/services/model/claude_provider.py +412 -0
  563. claude_mpm/services/model/model_router.py +453 -0
  564. claude_mpm/services/model/ollama_provider.py +415 -0
  565. claude_mpm/services/monitor/__init__.py +20 -0
  566. claude_mpm/services/monitor/daemon.py +671 -0
  567. claude_mpm/services/monitor/daemon_manager.py +963 -0
  568. claude_mpm/services/monitor/event_emitter.py +350 -0
  569. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  570. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  571. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  572. claude_mpm/services/monitor/handlers/file.py +264 -0
  573. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  574. claude_mpm/services/monitor/management/__init__.py +18 -0
  575. claude_mpm/services/monitor/management/health.py +124 -0
  576. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  577. claude_mpm/services/monitor/server.py +817 -0
  578. claude_mpm/services/monitor_build_service.py +2 -2
  579. claude_mpm/services/native_agent_converter.py +356 -0
  580. claude_mpm/services/orphan_detection.py +786 -0
  581. claude_mpm/services/port_manager.py +2 -2
  582. claude_mpm/services/project/__init__.py +23 -0
  583. claude_mpm/services/project/analyzer.py +3 -3
  584. claude_mpm/services/project/architecture_analyzer.py +5 -5
  585. claude_mpm/services/project/archive_manager.py +1045 -0
  586. claude_mpm/services/project/dependency_analyzer.py +4 -4
  587. claude_mpm/services/project/detection_strategies.py +719 -0
  588. claude_mpm/services/project/documentation_manager.py +553 -0
  589. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  590. claude_mpm/services/project/metrics_collector.py +4 -4
  591. claude_mpm/services/project/project_organizer.py +1005 -0
  592. claude_mpm/services/project/registry.py +13 -7
  593. claude_mpm/services/project/toolchain_analyzer.py +581 -0
  594. claude_mpm/services/project_port_allocator.py +596 -0
  595. claude_mpm/services/response_tracker.py +21 -10
  596. claude_mpm/services/runner_configuration_service.py +1 -0
  597. claude_mpm/services/self_upgrade_service.py +500 -0
  598. claude_mpm/services/session_management_service.py +7 -5
  599. claude_mpm/services/session_manager.py +380 -0
  600. claude_mpm/services/shared/__init__.py +2 -1
  601. claude_mpm/services/shared/async_service_base.py +16 -27
  602. claude_mpm/services/shared/config_service_base.py +17 -14
  603. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  604. claude_mpm/services/shared/service_factory.py +8 -5
  605. claude_mpm/services/socketio/client_proxy.py +60 -5
  606. claude_mpm/services/socketio/dashboard_server.py +361 -0
  607. claude_mpm/services/socketio/event_normalizer.py +10 -6
  608. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  609. claude_mpm/services/socketio/handlers/base.py +2 -2
  610. claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
  611. claude_mpm/services/socketio/handlers/connection.py +21 -40
  612. claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
  613. claude_mpm/services/socketio/handlers/file.py +46 -10
  614. claude_mpm/services/socketio/handlers/git.py +8 -8
  615. claude_mpm/services/socketio/handlers/hook.py +29 -17
  616. claude_mpm/services/socketio/handlers/registry.py +4 -2
  617. claude_mpm/services/socketio/monitor_client.py +364 -0
  618. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  619. claude_mpm/services/socketio/server/connection_manager.py +2 -2
  620. claude_mpm/services/socketio/server/core.py +141 -4
  621. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  622. claude_mpm/services/socketio/server/main.py +23 -21
  623. claude_mpm/services/socketio_client_manager.py +4 -4
  624. claude_mpm/services/subprocess_launcher_service.py +19 -15
  625. claude_mpm/services/system_instructions_service.py +2 -2
  626. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  627. claude_mpm/services/ticket_services/validation_service.py +5 -5
  628. claude_mpm/services/unified/__init__.py +65 -0
  629. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  630. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  631. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  632. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
  633. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
  634. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  635. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  636. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  637. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  638. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  639. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  640. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  641. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  642. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  643. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  644. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  645. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  646. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  647. claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
  648. claude_mpm/services/unified/interfaces.py +475 -0
  649. claude_mpm/services/unified/migration.py +509 -0
  650. claude_mpm/services/unified/strategies.py +534 -0
  651. claude_mpm/services/unified/unified_analyzer.py +542 -0
  652. claude_mpm/services/unified/unified_config.py +691 -0
  653. claude_mpm/services/unified/unified_deployment.py +470 -0
  654. claude_mpm/services/utility_service.py +6 -3
  655. claude_mpm/services/version_control/branch_strategy.py +2 -2
  656. claude_mpm/services/version_control/conflict_resolution.py +8 -4
  657. claude_mpm/services/version_control/git_operations.py +26 -24
  658. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  659. claude_mpm/services/version_control/version_parser.py +14 -11
  660. claude_mpm/services/version_service.py +104 -1
  661. claude_mpm/skills/__init__.py +42 -0
  662. claude_mpm/skills/agent_skills_injector.py +324 -0
  663. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  664. claude_mpm/skills/bundled/__init__.py +6 -0
  665. claude_mpm/skills/bundled/api-documentation.md +393 -0
  666. claude_mpm/skills/bundled/async-testing.md +571 -0
  667. claude_mpm/skills/bundled/code-review.md +143 -0
  668. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  669. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  670. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  671. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  672. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  673. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  674. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  675. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  676. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  677. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  678. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  679. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  680. claude_mpm/skills/bundled/database-migration.md +199 -0
  681. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  682. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  683. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  684. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  685. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  686. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  687. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  688. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  689. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  690. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  691. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  692. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  693. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  694. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  695. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  696. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  697. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  698. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  699. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  700. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  701. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  702. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  703. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  704. claude_mpm/skills/bundled/git-workflow.md +414 -0
  705. claude_mpm/skills/bundled/imagemagick.md +204 -0
  706. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  707. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  708. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  709. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  710. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  711. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  712. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  713. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  714. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  715. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  716. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  717. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  718. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  719. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  720. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  721. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  722. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  723. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  724. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  725. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  726. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  727. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  728. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  729. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  730. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  731. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  732. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  733. claude_mpm/skills/bundled/pdf.md +141 -0
  734. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  735. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  736. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  737. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  738. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  739. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  740. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  741. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  742. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  743. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  744. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  745. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  746. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  747. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  748. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  749. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  750. claude_mpm/skills/bundled/security-scanning.md +327 -0
  751. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  752. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  753. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  754. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  755. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  756. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  757. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  758. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  759. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  760. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  761. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  762. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  763. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  764. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  765. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  766. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  767. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  768. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  769. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  770. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  771. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  772. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  773. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  774. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  775. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  776. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  777. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  778. claude_mpm/skills/bundled/xlsx.md +157 -0
  779. claude_mpm/skills/registry.py +286 -0
  780. claude_mpm/skills/skill_manager.py +310 -0
  781. claude_mpm/skills/skills_registry.py +348 -0
  782. claude_mpm/skills/skills_service.py +739 -0
  783. claude_mpm/storage/state_storage.py +31 -31
  784. claude_mpm/tools/__main__.py +1 -1
  785. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  786. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  787. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  788. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  789. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  790. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  791. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  792. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  793. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  794. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  795. claude_mpm/tools/code_tree_builder.py +6 -6
  796. claude_mpm/tools/code_tree_events.py +14 -10
  797. claude_mpm/tools/socketio_debug.py +11 -11
  798. claude_mpm/utils/agent_dependency_loader.py +108 -27
  799. claude_mpm/utils/common.py +544 -0
  800. claude_mpm/utils/config_manager.py +12 -6
  801. claude_mpm/utils/database_connector.py +298 -0
  802. claude_mpm/utils/dependency_cache.py +2 -2
  803. claude_mpm/utils/dependency_strategies.py +15 -10
  804. claude_mpm/utils/display_helper.py +260 -0
  805. claude_mpm/utils/environment_context.py +4 -3
  806. claude_mpm/utils/error_handler.py +5 -3
  807. claude_mpm/utils/file_utils.py +13 -14
  808. claude_mpm/utils/git_analyzer.py +407 -0
  809. claude_mpm/utils/log_cleanup.py +627 -0
  810. claude_mpm/utils/path_operations.py +7 -4
  811. claude_mpm/utils/robust_installer.py +133 -24
  812. claude_mpm/utils/session_logging.py +2 -2
  813. claude_mpm/utils/subprocess_utils.py +9 -8
  814. claude_mpm/validation/agent_validator.py +6 -6
  815. claude_mpm/validation/frontmatter_validator.py +6 -6
  816. claude_mpm-4.24.0.dist-info/METADATA +675 -0
  817. claude_mpm-4.24.0.dist-info/RECORD +1018 -0
  818. {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
  819. claude_mpm/agents/INSTRUCTIONS.md +0 -261
  820. claude_mpm/agents/templates/agent-manager.md +0 -619
  821. claude_mpm/cli/commands/configure_tui.py +0 -1927
  822. claude_mpm/cli/commands/mpm_init.py +0 -594
  823. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  824. claude_mpm/dashboard/static/css/code-tree.css +0 -1408
  825. claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
  826. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
  827. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  828. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  829. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  830. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  831. claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
  832. claude_mpm/scripts/socketio_server_manager.py +0 -349
  833. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  834. claude_mpm/services/cli/dashboard_launcher.py +0 -423
  835. claude_mpm/services/cli/socketio_manager.py +0 -537
  836. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  837. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  838. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  839. claude_mpm/services/project/analyzer_refactored.py +0 -450
  840. claude_mpm/tools/code_tree_analyzer.py +0 -1693
  841. claude_mpm-4.1.26.dist-info/METADATA +0 -332
  842. claude_mpm-4.1.26.dist-info/RECORD +0 -606
  843. {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
  844. {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
  845. {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,881 @@
1
+ """
2
+ File Loader Strategy - Consolidates 215 file loading instances into 5 strategic loaders
3
+ Part of Phase 3 Configuration Consolidation
4
+ """
5
+
6
+ import configparser
7
+ import importlib.util
8
+ import json
9
+ import os
10
+ import re
11
+ from abc import ABC, abstractmethod
12
+ from dataclasses import dataclass
13
+ from enum import Enum
14
+ from pathlib import Path
15
+ from typing import Any, Callable, Dict, List, Optional, Union
16
+
17
+ import yaml
18
+
19
+ from claude_mpm.core.logging_utils import get_logger
20
+
21
+ from .unified_config_service import ConfigFormat, IConfigStrategy
22
+
23
+
24
+ class LoaderType(Enum):
25
+ """Strategic loader types consolidating 215 instances"""
26
+
27
+ STRUCTURED = "structured" # JSON, YAML, TOML - 85 instances
28
+ ENVIRONMENT = "environment" # ENV files and variables - 45 instances
29
+ PROGRAMMATIC = "programmatic" # Python modules - 35 instances
30
+ LEGACY = "legacy" # INI, properties - 30 instances
31
+ COMPOSITE = "composite" # Multi-source loading - 20 instances
32
+
33
+
34
+ @dataclass
35
+ class FileLoadContext:
36
+ """Context for file loading operations"""
37
+
38
+ path: Path
39
+ format: ConfigFormat
40
+ encoding: str = "utf-8"
41
+ strict: bool = True
42
+ interpolate: bool = False
43
+ includes: List[str] = None
44
+ excludes: List[str] = None
45
+ transformations: List[Callable] = None
46
+ fallback_paths: List[Path] = None
47
+
48
+
49
+ class BaseFileLoader(ABC):
50
+ """Base class for all file loaders"""
51
+
52
+ def __init__(self):
53
+ self.logger = get_logger(self.__class__.__name__)
54
+ self._cache = {}
55
+
56
+ @abstractmethod
57
+ def load(self, context: FileLoadContext) -> Dict[str, Any]:
58
+ """Load configuration from file"""
59
+
60
+ @abstractmethod
61
+ def supports(self, format: ConfigFormat) -> bool:
62
+ """Check if loader supports the format"""
63
+
64
+ def _read_file(self, path: Path, encoding: str = "utf-8") -> str:
65
+ """Read file with proper error handling"""
66
+ try:
67
+ with Path(path).open(
68
+ encoding=encoding,
69
+ ) as f:
70
+ return f.read()
71
+ except UnicodeDecodeError:
72
+ # Try with different encodings
73
+ for enc in ["latin-1", "cp1252", "utf-16"]:
74
+ try:
75
+ with Path(path).open(
76
+ encoding=enc,
77
+ ) as f:
78
+ self.logger.warning(
79
+ f"Read {path} with fallback encoding: {enc}"
80
+ )
81
+ return f.read()
82
+ except (UnicodeDecodeError, OSError):
83
+ continue
84
+ raise
85
+
86
+ def _apply_transformations(
87
+ self, config: Dict[str, Any], transformations: List[Callable]
88
+ ) -> Dict[str, Any]:
89
+ """Apply transformation pipeline"""
90
+ if not transformations:
91
+ return config
92
+
93
+ for transform in transformations:
94
+ try:
95
+ config = transform(config)
96
+ except Exception as e:
97
+ self.logger.error(f"Transformation failed: {e}")
98
+
99
+ return config
100
+
101
+
102
+ class StructuredFileLoader(BaseFileLoader):
103
+ """
104
+ Handles JSON, YAML, TOML formats
105
+ Consolidates 85 individual loaders
106
+ """
107
+
108
+ def supports(self, format: ConfigFormat) -> bool:
109
+ return format in [ConfigFormat.JSON, ConfigFormat.YAML, ConfigFormat.TOML]
110
+
111
+ def load(self, context: FileLoadContext) -> Dict[str, Any]:
112
+ """Load structured configuration files"""
113
+ if context.path in self._cache:
114
+ self.logger.debug(f"Using cached config: {context.path}")
115
+ return self._cache[context.path]
116
+
117
+ content = self._read_file(context.path, context.encoding)
118
+
119
+ if context.format == ConfigFormat.JSON:
120
+ config = self._load_json(content, context)
121
+ elif context.format == ConfigFormat.YAML:
122
+ config = self._load_yaml(content, context)
123
+ elif context.format == ConfigFormat.TOML:
124
+ config = self._load_toml(content, context)
125
+ else:
126
+ raise ValueError(f"Unsupported format: {context.format}")
127
+
128
+ # Handle includes
129
+ if context.includes:
130
+ config = self._process_includes(config, context)
131
+
132
+ # Handle excludes
133
+ if context.excludes:
134
+ config = self._process_excludes(config, context)
135
+
136
+ # Apply transformations
137
+ if context.transformations:
138
+ config = self._apply_transformations(config, context.transformations)
139
+
140
+ # Cache result
141
+ self._cache[context.path] = config
142
+
143
+ return config
144
+
145
+ def _load_json(self, content: str, context: FileLoadContext) -> Dict[str, Any]:
146
+ """Load JSON with comments support"""
147
+ # Remove comments if present
148
+ if "//" in content or "/*" in content:
149
+ content = self._strip_json_comments(content)
150
+
151
+ try:
152
+ return json.loads(content)
153
+ except json.JSONDecodeError as e:
154
+ if context.strict:
155
+ raise
156
+ self.logger.warning(f"JSON parse error, attempting recovery: {e}")
157
+ return self._recover_json(content)
158
+
159
+ def _load_yaml(self, content: str, context: FileLoadContext) -> Dict[str, Any]:
160
+ """Load YAML with advanced features"""
161
+ try:
162
+ # Support multiple documents
163
+ docs = list(yaml.safe_load_all(content))
164
+
165
+ if len(docs) == 1:
166
+ return docs[0] or {}
167
+ # Merge multiple documents
168
+ result = {}
169
+ for doc in docs:
170
+ if doc:
171
+ result.update(doc)
172
+ return result
173
+
174
+ except yaml.YAMLError as e:
175
+ if context.strict:
176
+ raise
177
+ self.logger.warning(f"YAML parse error: {e}")
178
+ return {}
179
+
180
+ def _load_toml(self, content: str, context: FileLoadContext) -> Dict[str, Any]:
181
+ """Load TOML configuration"""
182
+ try:
183
+ import toml
184
+
185
+ return toml.loads(content)
186
+ except ImportError:
187
+ self.logger.error("toml package not installed")
188
+ try:
189
+ import tomli
190
+
191
+ return tomli.loads(content)
192
+ except ImportError as e:
193
+ raise ImportError("Neither toml nor tomli package is installed") from e
194
+ except Exception as e:
195
+ if context.strict:
196
+ raise
197
+ self.logger.warning(f"TOML parse error: {e}")
198
+ return {}
199
+
200
+ def _strip_json_comments(self, content: str) -> str:
201
+ """Remove comments from JSON content"""
202
+ # Remove single-line comments
203
+ content = re.sub(r"//.*?$", "", content, flags=re.MULTILINE)
204
+ # Remove multi-line comments
205
+ return re.sub(r"/\*.*?\*/", "", content, flags=re.DOTALL)
206
+
207
+ def _recover_json(self, content: str) -> Dict[str, Any]:
208
+ """Attempt to recover from malformed JSON"""
209
+ # Try to fix common issues
210
+ content = content.replace("'", '"') # Single to double quotes
211
+ content = re.sub(r",\s*}", "}", content) # Trailing commas in objects
212
+ content = re.sub(r",\s*]", "]", content) # Trailing commas in arrays
213
+
214
+ try:
215
+ return json.loads(content)
216
+ except (json.JSONDecodeError, ValueError):
217
+ return {}
218
+
219
+ def _process_includes(
220
+ self, config: Dict[str, Any], context: FileLoadContext
221
+ ) -> Dict[str, Any]:
222
+ """Process include directives"""
223
+ for include_key in context.includes:
224
+ if include_key in config:
225
+ include_path = Path(config[include_key])
226
+ if not include_path.is_absolute():
227
+ include_path = context.path.parent / include_path
228
+
229
+ if include_path.exists():
230
+ include_context = FileLoadContext(
231
+ path=include_path,
232
+ format=self._detect_format(include_path),
233
+ encoding=context.encoding,
234
+ strict=context.strict,
235
+ )
236
+ included_config = self.load(include_context)
237
+
238
+ # Merge included config
239
+ config = self._merge_configs(config, included_config)
240
+
241
+ # Remove include directive
242
+ del config[include_key]
243
+
244
+ return config
245
+
246
+ def _process_excludes(
247
+ self, config: Dict[str, Any], context: FileLoadContext
248
+ ) -> Dict[str, Any]:
249
+ """Process exclude patterns"""
250
+ for pattern in context.excludes:
251
+ config = self._exclude_keys(config, pattern)
252
+ return config
253
+
254
+ def _exclude_keys(self, config: Dict[str, Any], pattern: str) -> Dict[str, Any]:
255
+ """Exclude keys matching pattern"""
256
+ if "*" in pattern or "?" in pattern:
257
+ # Glob pattern
258
+ import fnmatch
259
+
260
+ return {k: v for k, v in config.items() if not fnmatch.fnmatch(k, pattern)}
261
+ # Exact match
262
+ config.pop(pattern, None)
263
+ return config
264
+
265
+ def _merge_configs(
266
+ self, base: Dict[str, Any], override: Dict[str, Any]
267
+ ) -> Dict[str, Any]:
268
+ """Deep merge configurations"""
269
+ result = base.copy()
270
+
271
+ for key, value in override.items():
272
+ if (
273
+ key in result
274
+ and isinstance(result[key], dict)
275
+ and isinstance(value, dict)
276
+ ):
277
+ result[key] = self._merge_configs(result[key], value)
278
+ else:
279
+ result[key] = value
280
+
281
+ return result
282
+
283
+ def _detect_format(self, path: Path) -> ConfigFormat:
284
+ """Detect file format from extension"""
285
+ suffix = path.suffix.lower()
286
+
287
+ if suffix == ".json":
288
+ return ConfigFormat.JSON
289
+ if suffix in [".yaml", ".yml"]:
290
+ return ConfigFormat.YAML
291
+ if suffix == ".toml":
292
+ return ConfigFormat.TOML
293
+ # Try to detect from content
294
+ content = self._read_file(path)
295
+ if content.strip().startswith("{"):
296
+ return ConfigFormat.JSON
297
+ if ":" in content:
298
+ return ConfigFormat.YAML
299
+ return ConfigFormat.JSON
300
+
301
+
302
+ class EnvironmentFileLoader(BaseFileLoader):
303
+ """
304
+ Handles environment files and variables
305
+ Consolidates 45 individual loaders
306
+ """
307
+
308
+ def supports(self, format: ConfigFormat) -> bool:
309
+ return format == ConfigFormat.ENV
310
+
311
+ def load(self, context: FileLoadContext) -> Dict[str, Any]:
312
+ """Load environment configuration"""
313
+ config = {}
314
+
315
+ # Load from file if exists
316
+ if context.path and context.path.exists():
317
+ config.update(self._load_env_file(context.path, context))
318
+
319
+ # Load from environment variables
320
+ config.update(self._load_env_vars(context))
321
+
322
+ # Apply variable interpolation if requested
323
+ if context.interpolate:
324
+ config = self._interpolate_variables(config)
325
+
326
+ # Apply transformations
327
+ if context.transformations:
328
+ config = self._apply_transformations(config, context.transformations)
329
+
330
+ return config
331
+
332
+ def _load_env_file(self, path: Path, context: FileLoadContext) -> Dict[str, Any]:
333
+ """Load .env file format"""
334
+ config = {}
335
+ content = self._read_file(path, context.encoding)
336
+
337
+ for line in content.splitlines():
338
+ line = line.strip()
339
+
340
+ # Skip comments and empty lines
341
+ if not line or line.startswith("#"):
342
+ continue
343
+
344
+ # Parse KEY=VALUE format
345
+ if "=" in line:
346
+ key, value = line.split("=", 1)
347
+ key = key.strip()
348
+ value = value.strip()
349
+
350
+ # Remove quotes if present
351
+ if (value.startswith('"') and value.endswith('"')) or (
352
+ value.startswith("'") and value.endswith("'")
353
+ ):
354
+ value = value[1:-1]
355
+
356
+ # Parse value type
357
+ config[key] = self._parse_env_value(value)
358
+
359
+ return config
360
+
361
+ def _load_env_vars(self, context: FileLoadContext) -> Dict[str, Any]:
362
+ """Load from environment variables"""
363
+ config = {}
364
+ prefix = context.path.stem.upper() if context.path else ""
365
+
366
+ for key, value in os.environ.items():
367
+ # Check if key matches pattern
368
+ if self._should_include_env_var(key, prefix, context):
369
+ clean_key = self._clean_env_key(key, prefix)
370
+ config[clean_key] = self._parse_env_value(value)
371
+
372
+ return config
373
+
374
+ def _should_include_env_var(
375
+ self, key: str, prefix: str, context: FileLoadContext
376
+ ) -> bool:
377
+ """Check if environment variable should be included"""
378
+ if context.includes:
379
+ return any(key.startswith(inc) for inc in context.includes)
380
+ if context.excludes:
381
+ return not any(key.startswith(exc) for exc in context.excludes)
382
+ if prefix:
383
+ return key.startswith(prefix)
384
+ return True
385
+
386
+ def _clean_env_key(self, key: str, prefix: str) -> str:
387
+ """Clean environment variable key"""
388
+ if prefix and key.startswith(prefix):
389
+ key = key[len(prefix) :]
390
+ if key.startswith("_"):
391
+ key = key[1:]
392
+
393
+ # Convert to lowercase and replace underscores
394
+ return key.lower().replace("__", ".").replace("_", "-")
395
+
396
+ def _parse_env_value(self, value: str) -> Any:
397
+ """Parse environment variable value to appropriate type"""
398
+ # Boolean
399
+ if value.lower() in ["true", "false"]:
400
+ return value.lower() == "true"
401
+
402
+ # None
403
+ if value.lower() in ["none", "null"]:
404
+ return None
405
+
406
+ # Number
407
+ try:
408
+ if "." in value:
409
+ return float(value)
410
+ return int(value)
411
+ except ValueError:
412
+ pass
413
+
414
+ # JSON array or object
415
+ if value.startswith(("[", "{")):
416
+ try:
417
+ return json.loads(value)
418
+ except (json.JSONDecodeError, ValueError):
419
+ pass
420
+
421
+ # Comma-separated list
422
+ if "," in value:
423
+ return [v.strip() for v in value.split(",")]
424
+
425
+ return value
426
+
427
+ def _interpolate_variables(self, config: Dict[str, Any]) -> Dict[str, Any]:
428
+ """Interpolate variables in configuration values"""
429
+
430
+ def interpolate_value(value: Any) -> Any:
431
+ if isinstance(value, str):
432
+ # Replace ${VAR} or $VAR patterns
433
+ pattern = r"\$\{([^}]+)\}|\$(\w+)"
434
+
435
+ def replacer(match):
436
+ var_name = match.group(1) or match.group(2)
437
+ # Look in config first, then environment
438
+ if var_name in config:
439
+ return str(config[var_name])
440
+ if var_name in os.environ:
441
+ return os.environ[var_name]
442
+ return match.group(0)
443
+
444
+ return re.sub(pattern, replacer, value)
445
+
446
+ if isinstance(value, dict):
447
+ return {k: interpolate_value(v) for k, v in value.items()}
448
+
449
+ if isinstance(value, list):
450
+ return [interpolate_value(v) for v in value]
451
+
452
+ return value
453
+
454
+ return {k: interpolate_value(v) for k, v in config.items()}
455
+
456
+
457
+ class ProgrammaticFileLoader(BaseFileLoader):
458
+ """
459
+ Handles Python module configurations
460
+ Consolidates 35 individual loaders
461
+ """
462
+
463
+ def supports(self, format: ConfigFormat) -> bool:
464
+ return format == ConfigFormat.PYTHON
465
+
466
+ def load(self, context: FileLoadContext) -> Dict[str, Any]:
467
+ """Load Python module as configuration"""
468
+ if not context.path.exists():
469
+ raise FileNotFoundError(f"Python config not found: {context.path}")
470
+
471
+ # Load module
472
+ spec = importlib.util.spec_from_file_location("config", context.path)
473
+ if not spec or not spec.loader:
474
+ raise ImportError(f"Cannot load Python module: {context.path}")
475
+
476
+ module = importlib.util.module_from_spec(spec)
477
+ spec.loader.exec_module(module)
478
+
479
+ # Extract configuration
480
+ config = self._extract_config(module, context)
481
+
482
+ # Apply transformations
483
+ if context.transformations:
484
+ config = self._apply_transformations(config, context.transformations)
485
+
486
+ return config
487
+
488
+ def _extract_config(self, module: Any, context: FileLoadContext) -> Dict[str, Any]:
489
+ """Extract configuration from Python module"""
490
+ config = {}
491
+
492
+ # Look for specific config patterns
493
+ if hasattr(module, "CONFIG"):
494
+ # Direct CONFIG dict
495
+ config = module.CONFIG
496
+ elif hasattr(module, "config"):
497
+ # config dict or function
498
+ config = module.config() if callable(module.config) else module.config
499
+ elif hasattr(module, "get_config"):
500
+ # get_config function
501
+ config = module.get_config()
502
+ else:
503
+ # Extract all uppercase variables
504
+ for name in dir(module):
505
+ if name.isupper() and not name.startswith("_"):
506
+ value = getattr(module, name)
507
+ # Skip modules and functions unless specified
508
+ if not (callable(value) or isinstance(value, type)):
509
+ config[name] = value
510
+
511
+ # Apply includes/excludes
512
+ if context.includes:
513
+ config = {k: v for k, v in config.items() if k in context.includes}
514
+ if context.excludes:
515
+ config = {k: v for k, v in config.items() if k not in context.excludes}
516
+
517
+ return config
518
+
519
+
520
+ class LegacyFileLoader(BaseFileLoader):
521
+ """
522
+ Handles INI and properties files
523
+ Consolidates 30 individual loaders
524
+ """
525
+
526
+ def supports(self, format: ConfigFormat) -> bool:
527
+ return format == ConfigFormat.INI
528
+
529
+ def load(self, context: FileLoadContext) -> Dict[str, Any]:
530
+ """Load legacy configuration formats"""
531
+ content = self._read_file(context.path, context.encoding)
532
+
533
+ # Detect format from content if needed
534
+ if self._is_properties_format(content):
535
+ config = self._load_properties(content, context)
536
+ else:
537
+ config = self._load_ini(content, context)
538
+
539
+ # Apply transformations
540
+ if context.transformations:
541
+ config = self._apply_transformations(config, context.transformations)
542
+
543
+ return config
544
+
545
+ def _is_properties_format(self, content: str) -> bool:
546
+ """Check if content is Java properties format"""
547
+ # Properties files don't have sections
548
+ return not any(line.strip().startswith("[") for line in content.splitlines())
549
+
550
+ def _load_ini(self, content: str, context: FileLoadContext) -> Dict[str, Any]:
551
+ """Load INI format configuration"""
552
+ parser = configparser.ConfigParser(
553
+ interpolation=(
554
+ configparser.ExtendedInterpolation() if context.interpolate else None
555
+ ),
556
+ allow_no_value=True,
557
+ )
558
+
559
+ try:
560
+ parser.read_string(content)
561
+ except configparser.Error as e:
562
+ if context.strict:
563
+ raise
564
+ self.logger.warning(f"INI parse error: {e}")
565
+ return {}
566
+
567
+ # Convert to dict
568
+ config = {}
569
+
570
+ # Handle DEFAULT section
571
+ if parser.defaults():
572
+ config["_defaults"] = dict(parser.defaults())
573
+
574
+ # Handle other sections
575
+ for section in parser.sections():
576
+ config[section] = {}
577
+ for key, value in parser.items(section):
578
+ config[section][key] = self._parse_ini_value(value)
579
+
580
+ # Flatten if only one section (excluding defaults)
581
+ sections = [s for s in config if s != "_defaults"]
582
+ if len(sections) == 1 and not config.get("_defaults"):
583
+ config = config[sections[0]]
584
+
585
+ return config
586
+
587
+ def _load_properties(
588
+ self, content: str, context: FileLoadContext
589
+ ) -> Dict[str, Any]:
590
+ """Load Java properties format"""
591
+ config = {}
592
+
593
+ for line in content.splitlines():
594
+ line = line.strip()
595
+
596
+ # Skip comments and empty lines
597
+ if not line or line.startswith(("#", "!")):
598
+ continue
599
+
600
+ # Handle line continuation
601
+ while line.endswith("\\"):
602
+ line = line[:-1]
603
+ next_line = next(content.splitlines(), "")
604
+ line += next_line.strip()
605
+
606
+ # Parse key=value or key:value
607
+ if "=" in line:
608
+ key, value = line.split("=", 1)
609
+ elif ":" in line:
610
+ key, value = line.split(":", 1)
611
+ else:
612
+ # Key without value
613
+ key = line
614
+ value = ""
615
+
616
+ key = key.strip()
617
+ value = value.strip()
618
+
619
+ # Unescape special characters
620
+ value = self._unescape_properties_value(value)
621
+
622
+ # Store in nested dict structure based on dots in key
623
+ self._set_nested_value(config, key, value)
624
+
625
+ return config
626
+
627
+ def _parse_ini_value(self, value: str) -> Any:
628
+ """Parse INI value to appropriate type"""
629
+ if not value:
630
+ return ""
631
+
632
+ # Boolean
633
+ if value.lower() in ["true", "yes", "on", "1"]:
634
+ return True
635
+ if value.lower() in ["false", "no", "off", "0"]:
636
+ return False
637
+
638
+ # Number
639
+ try:
640
+ if "." in value:
641
+ return float(value)
642
+ return int(value)
643
+ except ValueError:
644
+ pass
645
+
646
+ # List (comma-separated)
647
+ if "," in value:
648
+ return [v.strip() for v in value.split(",")]
649
+
650
+ return value
651
+
652
+ def _unescape_properties_value(self, value: str) -> str:
653
+ """Unescape Java properties special characters"""
654
+ replacements = {
655
+ "\\n": "\n",
656
+ "\\r": "\r",
657
+ "\\t": "\t",
658
+ "\\\\": "\\",
659
+ "\\:": ":",
660
+ "\\=": "=",
661
+ "\\ ": " ",
662
+ }
663
+
664
+ for old, new in replacements.items():
665
+ value = value.replace(old, new)
666
+
667
+ return value
668
+
669
+ def _set_nested_value(self, config: Dict[str, Any], key: str, value: Any):
670
+ """Set value in nested dict structure based on dot notation"""
671
+ parts = key.split(".")
672
+ current = config
673
+
674
+ for part in parts[:-1]:
675
+ if part not in current:
676
+ current[part] = {}
677
+ current = current[part]
678
+
679
+ current[parts[-1]] = value
680
+
681
+
682
+ class CompositeFileLoader(BaseFileLoader):
683
+ """
684
+ Handles multi-source configuration loading
685
+ Consolidates 20 individual loaders
686
+ """
687
+
688
+ def __init__(self):
689
+ super().__init__()
690
+ self.loaders = {
691
+ LoaderType.STRUCTURED: StructuredFileLoader(),
692
+ LoaderType.ENVIRONMENT: EnvironmentFileLoader(),
693
+ LoaderType.PROGRAMMATIC: ProgrammaticFileLoader(),
694
+ LoaderType.LEGACY: LegacyFileLoader(),
695
+ }
696
+
697
+ def supports(self, format: ConfigFormat) -> bool:
698
+ """Composite loader supports all formats"""
699
+ return True
700
+
701
+ def load(self, context: FileLoadContext) -> Dict[str, Any]:
702
+ """Load configuration from multiple sources"""
703
+ configs = []
704
+
705
+ # Check for directory of configs
706
+ if context.path.is_dir():
707
+ configs.extend(self._load_directory(context))
708
+
709
+ # Check for fallback paths
710
+ if context.fallback_paths:
711
+ for fallback in context.fallback_paths:
712
+ if fallback.exists():
713
+ fallback_context = FileLoadContext(
714
+ path=fallback,
715
+ format=self._detect_format(fallback),
716
+ encoding=context.encoding,
717
+ strict=False, # Non-strict for fallbacks
718
+ )
719
+ try:
720
+ config = self._load_single(fallback_context)
721
+ configs.append(config)
722
+ except Exception as e:
723
+ self.logger.debug(f"Fallback load failed: {e}")
724
+
725
+ # Load primary config
726
+ if context.path.is_file():
727
+ configs.append(self._load_single(context))
728
+
729
+ # Merge all configs
730
+ result = {}
731
+ for config in configs:
732
+ result = self._deep_merge(result, config)
733
+
734
+ # Apply transformations
735
+ if context.transformations:
736
+ result = self._apply_transformations(result, context.transformations)
737
+
738
+ return result
739
+
740
+ def _load_directory(self, context: FileLoadContext) -> List[Dict[str, Any]]:
741
+ """Load all config files from directory"""
742
+ configs = []
743
+
744
+ # Define load order
745
+ patterns = ["default.*", "config.*", "settings.*", "*.config.*", "*.settings.*"]
746
+
747
+ # Load files in order
748
+ for pattern in patterns:
749
+ for file_path in context.path.glob(pattern):
750
+ if file_path.is_file():
751
+ file_context = FileLoadContext(
752
+ path=file_path,
753
+ format=self._detect_format(file_path),
754
+ encoding=context.encoding,
755
+ strict=context.strict,
756
+ )
757
+ try:
758
+ config = self._load_single(file_context)
759
+ configs.append(config)
760
+ except Exception as e:
761
+ self.logger.warning(f"Failed to load {file_path}: {e}")
762
+
763
+ return configs
764
+
765
+ def _load_single(self, context: FileLoadContext) -> Dict[str, Any]:
766
+ """Load single configuration file"""
767
+ # Find appropriate loader
768
+ for _loader_type, loader in self.loaders.items():
769
+ if loader.supports(context.format):
770
+ return loader.load(context)
771
+
772
+ raise ValueError(f"No loader available for format: {context.format}")
773
+
774
+ def _detect_format(self, path: Path) -> ConfigFormat:
775
+ """Detect configuration format from file"""
776
+ suffix = path.suffix.lower()
777
+
778
+ format_map = {
779
+ ".json": ConfigFormat.JSON,
780
+ ".yaml": ConfigFormat.YAML,
781
+ ".yml": ConfigFormat.YAML,
782
+ ".toml": ConfigFormat.TOML,
783
+ ".env": ConfigFormat.ENV,
784
+ ".py": ConfigFormat.PYTHON,
785
+ ".ini": ConfigFormat.INI,
786
+ ".cfg": ConfigFormat.INI,
787
+ ".conf": ConfigFormat.INI,
788
+ ".properties": ConfigFormat.INI,
789
+ }
790
+
791
+ return format_map.get(suffix, ConfigFormat.JSON)
792
+
793
+ def _deep_merge(
794
+ self, base: Dict[str, Any], override: Dict[str, Any]
795
+ ) -> Dict[str, Any]:
796
+ """Deep merge two configurations"""
797
+ result = base.copy()
798
+
799
+ for key, value in override.items():
800
+ if key in result:
801
+ if isinstance(result[key], dict) and isinstance(value, dict):
802
+ result[key] = self._deep_merge(result[key], value)
803
+ elif isinstance(result[key], list) and isinstance(value, list):
804
+ result[key].extend(value)
805
+ else:
806
+ result[key] = value
807
+ else:
808
+ result[key] = value
809
+
810
+ return result
811
+
812
+
813
+ class FileLoaderStrategy(IConfigStrategy):
814
+ """
815
+ Main strategy class integrating all file loaders
816
+ Reduces 215 file loading instances to 5 strategic loaders
817
+ """
818
+
819
+ def __init__(self):
820
+ self.logger = get_logger(self.__class__.__name__)
821
+ self.composite_loader = CompositeFileLoader()
822
+
823
+ def can_handle(self, source: Union[str, Path, Dict]) -> bool:
824
+ """Check if source is a file or directory"""
825
+ if isinstance(source, dict):
826
+ return False
827
+
828
+ path = Path(source)
829
+ return path.exists() or path.parent.exists()
830
+
831
+ def load(self, source: Any, **kwargs) -> Dict[str, Any]:
832
+ """Load configuration from file source"""
833
+ path = Path(source)
834
+
835
+ # Create load context
836
+ context = FileLoadContext(
837
+ path=path,
838
+ format=kwargs.get("format", self._detect_format(path)),
839
+ encoding=kwargs.get("encoding", "utf-8"),
840
+ strict=kwargs.get("strict", True),
841
+ interpolate=kwargs.get("interpolate", False),
842
+ includes=kwargs.get("includes"),
843
+ excludes=kwargs.get("excludes"),
844
+ transformations=kwargs.get("transformations"),
845
+ fallback_paths=[Path(p) for p in kwargs.get("fallback_paths", [])],
846
+ )
847
+
848
+ return self.composite_loader.load(context)
849
+
850
+ def validate(self, config: Dict[str, Any], schema: Optional[Dict] = None) -> bool:
851
+ """Validate loaded configuration"""
852
+ # Basic validation - can be extended
853
+ return config is not None and isinstance(config, dict)
854
+
855
+ def transform(self, config: Dict[str, Any]) -> Dict[str, Any]:
856
+ """Transform configuration to standard format"""
857
+ # Apply standard transformations
858
+ return self._normalize_config(config)
859
+
860
+ def _detect_format(self, path: Path) -> ConfigFormat:
861
+ """Detect configuration format"""
862
+ return self.composite_loader._detect_format(path)
863
+
864
+ def _normalize_config(self, config: Dict[str, Any]) -> Dict[str, Any]:
865
+ """Normalize configuration structure"""
866
+ # Convert all keys to lowercase
867
+ normalized = {}
868
+
869
+ for key, value in config.items():
870
+ norm_key = key.lower().replace("-", "_")
871
+
872
+ if isinstance(value, dict):
873
+ normalized[norm_key] = self._normalize_config(value)
874
+ else:
875
+ normalized[norm_key] = value
876
+
877
+ return normalized
878
+
879
+
880
+ # Export the main strategy
881
+ __all__ = ["FileLoadContext", "FileLoaderStrategy", "LoaderType"]