claude-mpm 4.1.6__py3-none-any.whl → 4.24.0__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (866) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__init__.py +20 -5
  4. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
  5. claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/BASE_OPS.md +219 -0
  8. claude_mpm/agents/BASE_PM.md +431 -214
  9. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
  10. claude_mpm/agents/BASE_QA.md +167 -0
  11. claude_mpm/agents/BASE_RESEARCH.md +53 -0
  12. claude_mpm/agents/MEMORY.md +3 -0
  13. claude_mpm/agents/OUTPUT_STYLE.md +335 -0
  14. claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
  15. claude_mpm/agents/WORKFLOW.md +355 -187
  16. claude_mpm/agents/agent_loader.py +40 -10
  17. claude_mpm/agents/agent_loader_integration.py +3 -2
  18. claude_mpm/agents/agents_metadata.py +57 -0
  19. claude_mpm/agents/async_agent_loader.py +3 -3
  20. claude_mpm/agents/base_agent_loader.py +11 -9
  21. claude_mpm/agents/frontmatter_validator.py +291 -251
  22. claude_mpm/agents/system_agent_config.py +3 -2
  23. claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
  24. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
  25. claude_mpm/agents/templates/README.md +465 -0
  26. claude_mpm/agents/templates/agent-manager.json +267 -18
  27. claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
  28. claude_mpm/agents/templates/api_qa.json +16 -4
  29. claude_mpm/agents/templates/circuit_breakers.md +638 -0
  30. claude_mpm/agents/templates/clerk-ops.json +235 -0
  31. claude_mpm/agents/templates/code_analyzer.json +25 -9
  32. claude_mpm/agents/templates/content-agent.json +358 -0
  33. claude_mpm/agents/templates/dart_engineer.json +307 -0
  34. claude_mpm/agents/templates/data_engineer.json +87 -14
  35. claude_mpm/agents/templates/documentation.json +76 -13
  36. claude_mpm/agents/templates/engineer.json +44 -10
  37. claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
  38. claude_mpm/agents/templates/git_file_tracking.md +584 -0
  39. claude_mpm/agents/templates/golang_engineer.json +270 -0
  40. claude_mpm/agents/templates/imagemagick.json +5 -2
  41. claude_mpm/agents/templates/java_engineer.json +346 -0
  42. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  43. claude_mpm/agents/templates/local_ops_agent.json +1840 -0
  44. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
  45. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
  46. claude_mpm/agents/templates/memory_manager.json +6 -3
  47. claude_mpm/agents/templates/nextjs_engineer.json +285 -0
  48. claude_mpm/agents/templates/ops.json +27 -8
  49. claude_mpm/agents/templates/php-engineer.json +287 -0
  50. claude_mpm/agents/templates/pm_examples.md +474 -0
  51. claude_mpm/agents/templates/pm_red_flags.md +262 -0
  52. claude_mpm/agents/templates/product_owner.json +338 -0
  53. claude_mpm/agents/templates/project_organizer.json +19 -5
  54. claude_mpm/agents/templates/prompt-engineer.json +737 -0
  55. claude_mpm/agents/templates/python_engineer.json +387 -0
  56. claude_mpm/agents/templates/qa.json +26 -6
  57. claude_mpm/agents/templates/react_engineer.json +239 -0
  58. claude_mpm/agents/templates/refactoring_engineer.json +15 -5
  59. claude_mpm/agents/templates/research.json +47 -22
  60. claude_mpm/agents/templates/response_format.md +583 -0
  61. claude_mpm/agents/templates/ruby-engineer.json +280 -0
  62. claude_mpm/agents/templates/rust_engineer.json +275 -0
  63. claude_mpm/agents/templates/security.json +59 -10
  64. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  65. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  66. claude_mpm/agents/templates/ticketing.json +16 -7
  67. claude_mpm/agents/templates/typescript_engineer.json +285 -0
  68. claude_mpm/agents/templates/validation_templates.md +312 -0
  69. claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
  70. claude_mpm/agents/templates/version_control.json +16 -4
  71. claude_mpm/agents/templates/web_qa.json +243 -21
  72. claude_mpm/agents/templates/web_ui.json +18 -5
  73. claude_mpm/cli/__init__.py +38 -363
  74. claude_mpm/cli/commands/__init__.py +8 -0
  75. claude_mpm/cli/commands/agent_manager.py +675 -20
  76. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  77. claude_mpm/cli/commands/agents.py +722 -150
  78. claude_mpm/cli/commands/agents_detect.py +380 -0
  79. claude_mpm/cli/commands/agents_recommend.py +309 -0
  80. claude_mpm/cli/commands/aggregate.py +10 -6
  81. claude_mpm/cli/commands/analyze.py +553 -0
  82. claude_mpm/cli/commands/analyze_code.py +528 -0
  83. claude_mpm/cli/commands/auto_configure.py +570 -0
  84. claude_mpm/cli/commands/cleanup.py +12 -12
  85. claude_mpm/cli/commands/config.py +47 -13
  86. claude_mpm/cli/commands/configure.py +488 -884
  87. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  88. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  89. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  90. claude_mpm/cli/commands/configure_models.py +18 -0
  91. claude_mpm/cli/commands/configure_navigation.py +167 -0
  92. claude_mpm/cli/commands/configure_paths.py +104 -0
  93. claude_mpm/cli/commands/configure_persistence.py +254 -0
  94. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  95. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  96. claude_mpm/cli/commands/configure_validators.py +73 -0
  97. claude_mpm/cli/commands/dashboard.py +286 -0
  98. claude_mpm/cli/commands/debug.py +1386 -0
  99. claude_mpm/cli/commands/doctor.py +43 -7
  100. claude_mpm/cli/commands/info.py +3 -4
  101. claude_mpm/cli/commands/local_deploy.py +537 -0
  102. claude_mpm/cli/commands/mcp.py +17 -10
  103. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  104. claude_mpm/cli/commands/mcp_config.py +154 -0
  105. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  106. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  107. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  108. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  109. claude_mpm/cli/commands/memory.py +55 -21
  110. claude_mpm/cli/commands/monitor.py +168 -617
  111. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  112. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  113. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  114. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  115. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  116. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  117. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  118. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  119. claude_mpm/cli/commands/run.py +169 -42
  120. claude_mpm/cli/commands/search.py +458 -0
  121. claude_mpm/cli/commands/skills.py +488 -0
  122. claude_mpm/cli/commands/uninstall.py +176 -0
  123. claude_mpm/cli/commands/upgrade.py +152 -0
  124. claude_mpm/cli/commands/verify.py +119 -0
  125. claude_mpm/cli/executor.py +204 -0
  126. claude_mpm/cli/helpers.py +105 -0
  127. claude_mpm/cli/interactive/__init__.py +21 -0
  128. claude_mpm/cli/interactive/agent_wizard.py +962 -0
  129. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  130. claude_mpm/cli/parser.py +79 -2
  131. claude_mpm/cli/parsers/__init__.py +7 -1
  132. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  133. claude_mpm/cli/parsers/agents_parser.py +116 -0
  134. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  135. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  136. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  137. claude_mpm/cli/parsers/base_parser.py +187 -3
  138. claude_mpm/cli/parsers/configure_parser.py +34 -15
  139. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  140. claude_mpm/cli/parsers/debug_parser.py +319 -0
  141. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  142. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  143. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  144. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  145. claude_mpm/cli/parsers/run_parser.py +5 -0
  146. claude_mpm/cli/parsers/search_parser.py +245 -0
  147. claude_mpm/cli/parsers/skills_parser.py +137 -0
  148. claude_mpm/cli/shared/argument_patterns.py +20 -13
  149. claude_mpm/cli/shared/base_command.py +2 -2
  150. claude_mpm/cli/shared/output_formatters.py +28 -19
  151. claude_mpm/cli/startup.py +562 -0
  152. claude_mpm/cli/startup_logging.py +179 -13
  153. claude_mpm/cli/utils.py +53 -2
  154. claude_mpm/commands/__init__.py +14 -0
  155. claude_mpm/commands/mpm-agents-detect.md +168 -0
  156. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  157. claude_mpm/commands/mpm-agents.md +122 -0
  158. claude_mpm/commands/mpm-auto-configure.md +269 -0
  159. claude_mpm/commands/mpm-config.md +141 -0
  160. claude_mpm/commands/mpm-doctor.md +24 -0
  161. claude_mpm/commands/mpm-help.md +290 -0
  162. claude_mpm/commands/mpm-init.md +521 -0
  163. claude_mpm/commands/mpm-monitor.md +409 -0
  164. claude_mpm/commands/mpm-organize.md +295 -0
  165. claude_mpm/commands/mpm-resume.md +372 -0
  166. claude_mpm/commands/mpm-status.md +75 -0
  167. claude_mpm/commands/mpm-tickets.md +151 -0
  168. claude_mpm/commands/mpm-version.md +113 -0
  169. claude_mpm/commands/mpm.md +21 -0
  170. claude_mpm/config/agent_config.py +4 -4
  171. claude_mpm/config/experimental_features.py +7 -7
  172. claude_mpm/config/model_config.py +428 -0
  173. claude_mpm/config/paths.py +3 -2
  174. claude_mpm/config/socketio_config.py +36 -7
  175. claude_mpm/constants.py +27 -1
  176. claude_mpm/core/__init__.py +53 -17
  177. claude_mpm/core/agent_name_normalizer.py +3 -2
  178. claude_mpm/core/agent_registry.py +2 -2
  179. claude_mpm/core/agent_session_manager.py +10 -10
  180. claude_mpm/core/api_validator.py +330 -0
  181. claude_mpm/core/base_service.py +33 -23
  182. claude_mpm/core/cache.py +9 -9
  183. claude_mpm/core/claude_runner.py +19 -8
  184. claude_mpm/core/config.py +103 -8
  185. claude_mpm/core/config_aliases.py +7 -6
  186. claude_mpm/core/constants.py +65 -0
  187. claude_mpm/core/container.py +11 -5
  188. claude_mpm/core/enums.py +452 -0
  189. claude_mpm/core/error_handler.py +623 -0
  190. claude_mpm/core/factories.py +1 -1
  191. claude_mpm/core/file_utils.py +764 -0
  192. claude_mpm/core/framework/__init__.py +38 -0
  193. claude_mpm/core/framework/formatters/__init__.py +11 -0
  194. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  195. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  196. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  197. claude_mpm/core/framework/loaders/__init__.py +13 -0
  198. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  199. claude_mpm/core/framework/loaders/file_loader.py +223 -0
  200. claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
  201. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  202. claude_mpm/core/framework/processors/__init__.py +11 -0
  203. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  204. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  205. claude_mpm/core/framework/processors/template_processor.py +244 -0
  206. claude_mpm/core/framework_loader.py +323 -1491
  207. claude_mpm/core/hook_manager.py +8 -6
  208. claude_mpm/core/injectable_service.py +11 -8
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +55 -8
  211. claude_mpm/core/interfaces.py +56 -1
  212. claude_mpm/core/lazy.py +3 -3
  213. claude_mpm/core/log_manager.py +100 -28
  214. claude_mpm/core/logger.py +19 -14
  215. claude_mpm/core/logging_config.py +6 -2
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/oneshot_session.py +51 -7
  218. claude_mpm/core/optimized_agent_loader.py +9 -9
  219. claude_mpm/core/optimized_startup.py +1 -1
  220. claude_mpm/core/output_style_manager.py +12 -192
  221. claude_mpm/core/pm_hook_interceptor.py +118 -15
  222. claude_mpm/core/service_registry.py +7 -3
  223. claude_mpm/core/session_manager.py +14 -12
  224. claude_mpm/core/shared/config_loader.py +1 -1
  225. claude_mpm/core/socketio_pool.py +15 -15
  226. claude_mpm/core/tool_access_control.py +3 -2
  227. claude_mpm/core/types.py +4 -11
  228. claude_mpm/core/typing_utils.py +7 -6
  229. claude_mpm/core/unified_agent_registry.py +116 -12
  230. claude_mpm/core/unified_config.py +6 -6
  231. claude_mpm/core/unified_paths.py +23 -20
  232. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
  233. claude_mpm/dashboard/__init__.py +12 -0
  234. claude_mpm/dashboard/analysis_runner.py +455 -0
  235. claude_mpm/dashboard/api/simple_directory.py +261 -0
  236. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  237. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  238. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  239. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  240. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  241. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  242. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  243. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  244. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  245. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  246. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  247. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  248. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  249. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  250. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  251. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  252. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  253. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  254. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  255. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  256. claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
  257. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  258. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  259. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  260. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  261. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  262. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  263. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  264. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  265. claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
  266. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
  267. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  268. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  269. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  270. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  271. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  272. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  273. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  274. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  275. claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
  276. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  277. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  278. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  279. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  280. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
  281. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  282. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  283. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  284. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  285. claude_mpm/dashboard/static/built/react/events.js +30 -0
  286. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  287. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  288. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  289. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  290. claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
  291. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  292. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  293. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  294. claude_mpm/dashboard/static/css/activity.css +1958 -0
  295. claude_mpm/dashboard/static/css/dashboard.css +1413 -72
  296. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  297. claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  298. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  299. claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  300. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  301. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  302. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  303. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  304. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  305. claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
  306. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  307. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  308. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
  309. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  310. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  311. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  312. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  313. claude_mpm/dashboard/static/events.html +607 -0
  314. claude_mpm/dashboard/static/index.html +635 -0
  315. claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
  316. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  317. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  318. claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
  319. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  320. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  321. claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
  322. claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
  323. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  324. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  325. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  326. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  327. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  328. claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
  329. claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
  330. claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
  331. claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
  332. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
  333. claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
  334. claude_mpm/dashboard/static/js/connection-manager.js +1 -1
  335. claude_mpm/dashboard/static/js/dashboard.js +523 -622
  336. claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
  337. claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
  338. claude_mpm/dashboard/static/js/shared/logger.js +385 -0
  339. claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
  340. claude_mpm/dashboard/static/js/socket-client.js +549 -62
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  342. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  343. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  344. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  345. claude_mpm/dashboard/static/legacy/files.html +747 -0
  346. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  347. claude_mpm/dashboard/static/monitors.html +431 -0
  348. claude_mpm/dashboard/static/production/events.html +659 -0
  349. claude_mpm/dashboard/static/production/main.html +698 -0
  350. claude_mpm/dashboard/static/production/monitors.html +483 -0
  351. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  352. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  353. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  354. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  355. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  356. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  357. claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
  358. claude_mpm/dashboard/templates/code_simple.html +153 -0
  359. claude_mpm/dashboard/templates/index.html +267 -9
  360. claude_mpm/experimental/__init__.py +10 -0
  361. claude_mpm/experimental/cli_enhancements.py +4 -2
  362. claude_mpm/generators/agent_profile_generator.py +5 -3
  363. claude_mpm/hooks/__init__.py +37 -1
  364. claude_mpm/hooks/base_hook.py +5 -4
  365. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  366. claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
  367. claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
  368. claude_mpm/hooks/claude_hooks/installer.py +783 -0
  369. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  370. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  371. claude_mpm/hooks/claude_hooks/services/connection_manager.py +64 -49
  372. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  373. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  374. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  375. claude_mpm/hooks/failure_learning/__init__.py +60 -0
  376. claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
  377. claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
  378. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
  379. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  380. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  381. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  382. claude_mpm/hooks/kuzu_response_hook.py +183 -0
  383. claude_mpm/hooks/memory_integration_hook.py +1 -1
  384. claude_mpm/hooks/session_resume_hook.py +121 -0
  385. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  386. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  387. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  388. claude_mpm/hooks/validation_hooks.py +3 -3
  389. claude_mpm/init.py +23 -4
  390. claude_mpm/models/agent_session.py +8 -6
  391. claude_mpm/models/resume_log.py +340 -0
  392. claude_mpm/schemas/__init__.py +12 -0
  393. claude_mpm/scripts/claude-hook-handler.sh +187 -0
  394. claude_mpm/scripts/launch_monitor.py +85 -0
  395. claude_mpm/scripts/mcp_server.py +3 -5
  396. claude_mpm/scripts/mpm_doctor.py +3 -2
  397. claude_mpm/scripts/socketio_daemon.py +156 -396
  398. claude_mpm/services/__init__.py +144 -160
  399. claude_mpm/services/agents/__init__.py +18 -5
  400. claude_mpm/services/agents/agent_builder.py +13 -11
  401. claude_mpm/services/agents/auto_config_manager.py +796 -0
  402. claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
  403. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  404. claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
  405. claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
  406. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  407. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  408. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
  409. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  410. claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
  411. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  412. claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
  413. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  414. claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
  415. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  416. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  417. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  418. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  419. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  420. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  421. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  422. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
  423. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  424. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  425. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  426. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  427. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  428. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  429. claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
  430. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  431. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  432. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  433. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  434. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  435. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
  436. claude_mpm/services/agents/local_template_manager.py +744 -0
  437. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  438. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  439. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  440. claude_mpm/services/agents/memory/content_manager.py +17 -9
  441. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  442. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  443. claude_mpm/services/agents/memory/memory_format_service.py +7 -7
  444. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  445. claude_mpm/services/agents/memory/template_generator.py +3 -3
  446. claude_mpm/services/agents/observers.py +547 -0
  447. claude_mpm/services/agents/recommender.py +615 -0
  448. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  449. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  450. claude_mpm/services/async_session_logger.py +141 -98
  451. claude_mpm/services/claude_session_logger.py +82 -74
  452. claude_mpm/services/cli/agent_cleanup_service.py +6 -5
  453. claude_mpm/services/cli/agent_dependency_service.py +1 -1
  454. claude_mpm/services/cli/agent_listing_service.py +5 -5
  455. claude_mpm/services/cli/agent_validation_service.py +6 -5
  456. claude_mpm/services/cli/memory_crud_service.py +12 -7
  457. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  458. claude_mpm/services/cli/resume_service.py +617 -0
  459. claude_mpm/services/cli/session_manager.py +104 -13
  460. claude_mpm/services/cli/session_pause_manager.py +504 -0
  461. claude_mpm/services/cli/session_resume_helper.py +372 -0
  462. claude_mpm/services/cli/startup_checker.py +13 -21
  463. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  464. claude_mpm/services/command_deployment_service.py +17 -9
  465. claude_mpm/services/command_handler_service.py +11 -5
  466. claude_mpm/services/core/__init__.py +33 -1
  467. claude_mpm/services/core/base.py +26 -11
  468. claude_mpm/services/core/cache_manager.py +1 -3
  469. claude_mpm/services/core/interfaces/__init__.py +90 -3
  470. claude_mpm/services/core/interfaces/agent.py +184 -0
  471. claude_mpm/services/core/interfaces/health.py +172 -0
  472. claude_mpm/services/core/interfaces/model.py +281 -0
  473. claude_mpm/services/core/interfaces/process.py +372 -0
  474. claude_mpm/services/core/interfaces/project.py +121 -0
  475. claude_mpm/services/core/interfaces/restart.py +307 -0
  476. claude_mpm/services/core/interfaces/stability.py +260 -0
  477. claude_mpm/services/core/interfaces.py +56 -1
  478. claude_mpm/services/core/memory_manager.py +92 -47
  479. claude_mpm/services/core/models/__init__.py +79 -0
  480. claude_mpm/services/core/models/agent_config.py +384 -0
  481. claude_mpm/services/core/models/health.py +162 -0
  482. claude_mpm/services/core/models/process.py +239 -0
  483. claude_mpm/services/core/models/restart.py +302 -0
  484. claude_mpm/services/core/models/stability.py +264 -0
  485. claude_mpm/services/core/models/toolchain.py +306 -0
  486. claude_mpm/services/core/path_resolver.py +37 -18
  487. claude_mpm/services/core/service_container.py +2 -2
  488. claude_mpm/services/diagnostics/__init__.py +2 -2
  489. claude_mpm/services/diagnostics/checks/__init__.py +4 -2
  490. claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
  491. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  492. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  493. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  494. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  495. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  496. claude_mpm/services/diagnostics/checks/instructions_check.py +22 -24
  497. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
  498. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
  499. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
  500. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  501. claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
  502. claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
  503. claude_mpm/services/diagnostics/models.py +37 -21
  504. claude_mpm/services/event_aggregator.py +5 -3
  505. claude_mpm/services/event_bus/direct_relay.py +152 -13
  506. claude_mpm/services/event_bus/event_bus.py +51 -9
  507. claude_mpm/services/event_bus/relay.py +33 -14
  508. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  509. claude_mpm/services/events/core.py +5 -6
  510. claude_mpm/services/events/producers/hook.py +6 -6
  511. claude_mpm/services/events/producers/system.py +8 -8
  512. claude_mpm/services/exceptions.py +5 -5
  513. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  514. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  515. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  516. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  517. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  518. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  519. claude_mpm/services/hook_installer_service.py +506 -0
  520. claude_mpm/services/hook_service.py +5 -6
  521. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  522. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  523. claude_mpm/services/infrastructure/logging.py +2 -2
  524. claude_mpm/services/infrastructure/monitoring/__init__.py +12 -12
  525. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  526. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  527. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  528. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  529. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  530. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  531. claude_mpm/services/infrastructure/monitoring.py +12 -12
  532. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  533. claude_mpm/services/local_ops/__init__.py +165 -0
  534. claude_mpm/services/local_ops/crash_detector.py +257 -0
  535. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  536. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  537. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  538. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  539. claude_mpm/services/local_ops/health_manager.py +430 -0
  540. claude_mpm/services/local_ops/log_monitor.py +396 -0
  541. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  542. claude_mpm/services/local_ops/process_manager.py +595 -0
  543. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  544. claude_mpm/services/local_ops/restart_manager.py +401 -0
  545. claude_mpm/services/local_ops/restart_policy.py +387 -0
  546. claude_mpm/services/local_ops/state_manager.py +372 -0
  547. claude_mpm/services/local_ops/unified_manager.py +600 -0
  548. claude_mpm/services/mcp_config_manager.py +1612 -0
  549. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  550. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  551. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  552. claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
  553. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  554. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  555. claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
  556. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  557. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  558. claude_mpm/services/mcp_gateway/main.py +90 -15
  559. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  560. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  561. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
  562. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
  563. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  564. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  565. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  566. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  567. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  568. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  569. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
  570. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  571. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  572. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  573. claude_mpm/services/mcp_service_verifier.py +729 -0
  574. claude_mpm/services/memory/builder.py +9 -8
  575. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  576. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  577. claude_mpm/services/memory/failure_tracker.py +578 -0
  578. claude_mpm/services/memory/indexed_memory.py +8 -8
  579. claude_mpm/services/memory/optimizer.py +8 -9
  580. claude_mpm/services/memory/router.py +3 -3
  581. claude_mpm/services/memory_hook_service.py +165 -4
  582. claude_mpm/services/model/__init__.py +147 -0
  583. claude_mpm/services/model/base_provider.py +365 -0
  584. claude_mpm/services/model/claude_provider.py +412 -0
  585. claude_mpm/services/model/model_router.py +453 -0
  586. claude_mpm/services/model/ollama_provider.py +415 -0
  587. claude_mpm/services/monitor/__init__.py +20 -0
  588. claude_mpm/services/monitor/daemon.py +671 -0
  589. claude_mpm/services/monitor/daemon_manager.py +963 -0
  590. claude_mpm/services/monitor/event_emitter.py +350 -0
  591. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  592. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  593. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  594. claude_mpm/services/monitor/handlers/file.py +264 -0
  595. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  596. claude_mpm/services/monitor/management/__init__.py +18 -0
  597. claude_mpm/services/monitor/management/health.py +124 -0
  598. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  599. claude_mpm/services/monitor/server.py +817 -0
  600. claude_mpm/services/monitor_build_service.py +2 -2
  601. claude_mpm/services/native_agent_converter.py +356 -0
  602. claude_mpm/services/orphan_detection.py +786 -0
  603. claude_mpm/services/port_manager.py +2 -2
  604. claude_mpm/services/project/__init__.py +23 -0
  605. claude_mpm/services/project/analyzer.py +3 -3
  606. claude_mpm/services/project/architecture_analyzer.py +6 -6
  607. claude_mpm/services/project/archive_manager.py +1045 -0
  608. claude_mpm/services/project/dependency_analyzer.py +8 -8
  609. claude_mpm/services/project/detection_strategies.py +719 -0
  610. claude_mpm/services/project/documentation_manager.py +553 -0
  611. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  612. claude_mpm/services/project/language_analyzer.py +3 -3
  613. claude_mpm/services/project/metrics_collector.py +7 -10
  614. claude_mpm/services/project/project_organizer.py +1005 -0
  615. claude_mpm/services/project/registry.py +13 -7
  616. claude_mpm/services/project/toolchain_analyzer.py +581 -0
  617. claude_mpm/services/project_port_allocator.py +596 -0
  618. claude_mpm/services/response_tracker.py +21 -10
  619. claude_mpm/services/runner_configuration_service.py +1 -0
  620. claude_mpm/services/self_upgrade_service.py +500 -0
  621. claude_mpm/services/session_management_service.py +7 -5
  622. claude_mpm/services/session_manager.py +380 -0
  623. claude_mpm/services/shared/__init__.py +2 -1
  624. claude_mpm/services/shared/async_service_base.py +16 -27
  625. claude_mpm/services/shared/config_service_base.py +17 -14
  626. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  627. claude_mpm/services/shared/service_factory.py +8 -5
  628. claude_mpm/services/socketio/client_proxy.py +60 -5
  629. claude_mpm/services/socketio/dashboard_server.py +361 -0
  630. claude_mpm/services/socketio/event_normalizer.py +74 -6
  631. claude_mpm/services/socketio/handlers/__init__.py +5 -0
  632. claude_mpm/services/socketio/handlers/base.py +2 -2
  633. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  634. claude_mpm/services/socketio/handlers/connection.py +21 -40
  635. claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
  636. claude_mpm/services/socketio/handlers/file.py +46 -10
  637. claude_mpm/services/socketio/handlers/git.py +8 -8
  638. claude_mpm/services/socketio/handlers/hook.py +29 -17
  639. claude_mpm/services/socketio/handlers/registry.py +4 -0
  640. claude_mpm/services/socketio/monitor_client.py +364 -0
  641. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  642. claude_mpm/services/socketio/server/connection_manager.py +131 -68
  643. claude_mpm/services/socketio/server/core.py +275 -22
  644. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  645. claude_mpm/services/socketio/server/main.py +99 -29
  646. claude_mpm/services/socketio_client_manager.py +4 -4
  647. claude_mpm/services/subprocess_launcher_service.py +19 -15
  648. claude_mpm/services/system_instructions_service.py +2 -2
  649. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  650. claude_mpm/services/ticket_services/validation_service.py +5 -5
  651. claude_mpm/services/unified/__init__.py +65 -0
  652. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  653. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  654. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  655. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
  656. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
  657. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  658. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  659. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  660. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  661. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  662. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  663. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  664. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  665. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  666. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  667. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  668. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  669. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  670. claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
  671. claude_mpm/services/unified/interfaces.py +475 -0
  672. claude_mpm/services/unified/migration.py +509 -0
  673. claude_mpm/services/unified/strategies.py +534 -0
  674. claude_mpm/services/unified/unified_analyzer.py +542 -0
  675. claude_mpm/services/unified/unified_config.py +691 -0
  676. claude_mpm/services/unified/unified_deployment.py +470 -0
  677. claude_mpm/services/utility_service.py +6 -3
  678. claude_mpm/services/version_control/branch_strategy.py +2 -2
  679. claude_mpm/services/version_control/conflict_resolution.py +8 -4
  680. claude_mpm/services/version_control/git_operations.py +26 -24
  681. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  682. claude_mpm/services/version_control/version_parser.py +14 -11
  683. claude_mpm/services/version_service.py +104 -1
  684. claude_mpm/services/visualization/__init__.py +19 -0
  685. claude_mpm/services/visualization/mermaid_generator.py +938 -0
  686. claude_mpm/skills/__init__.py +42 -0
  687. claude_mpm/skills/agent_skills_injector.py +324 -0
  688. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  689. claude_mpm/skills/bundled/__init__.py +6 -0
  690. claude_mpm/skills/bundled/api-documentation.md +393 -0
  691. claude_mpm/skills/bundled/async-testing.md +571 -0
  692. claude_mpm/skills/bundled/code-review.md +143 -0
  693. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  694. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  695. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  696. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  697. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  698. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  699. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  700. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  701. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  702. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  703. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  704. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  705. claude_mpm/skills/bundled/database-migration.md +199 -0
  706. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  707. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  708. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  709. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  710. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  711. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  712. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  713. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  714. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  715. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  716. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  717. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  718. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  719. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  720. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  721. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  722. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  723. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  724. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  725. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  726. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  727. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  728. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  729. claude_mpm/skills/bundled/git-workflow.md +414 -0
  730. claude_mpm/skills/bundled/imagemagick.md +204 -0
  731. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  732. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  733. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  734. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  735. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  736. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  737. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  738. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  739. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  740. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  741. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  742. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  743. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  744. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  745. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  746. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  747. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  748. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  749. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  750. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  751. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  752. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  753. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  754. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  755. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  756. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  757. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  758. claude_mpm/skills/bundled/pdf.md +141 -0
  759. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  760. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  761. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  762. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  763. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  764. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  765. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  766. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  767. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  768. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  769. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  770. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  771. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  772. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  773. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  774. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  775. claude_mpm/skills/bundled/security-scanning.md +327 -0
  776. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  777. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  778. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  779. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  780. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  781. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  782. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  783. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  784. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  785. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  786. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  787. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  788. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  789. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  790. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  791. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  792. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  793. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  794. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  795. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  796. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  797. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  798. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  799. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  800. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  801. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  802. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  803. claude_mpm/skills/bundled/xlsx.md +157 -0
  804. claude_mpm/skills/registry.py +286 -0
  805. claude_mpm/skills/skill_manager.py +310 -0
  806. claude_mpm/skills/skills_registry.py +348 -0
  807. claude_mpm/skills/skills_service.py +739 -0
  808. claude_mpm/storage/state_storage.py +31 -31
  809. claude_mpm/tools/__init__.py +10 -0
  810. claude_mpm/tools/__main__.py +208 -0
  811. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  812. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  813. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  814. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  815. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  816. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  817. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  818. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  819. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  820. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  821. claude_mpm/tools/code_tree_builder.py +631 -0
  822. claude_mpm/tools/code_tree_events.py +420 -0
  823. claude_mpm/tools/socketio_debug.py +671 -0
  824. claude_mpm/utils/agent_dependency_loader.py +108 -27
  825. claude_mpm/utils/common.py +544 -0
  826. claude_mpm/utils/config_manager.py +12 -6
  827. claude_mpm/utils/database_connector.py +298 -0
  828. claude_mpm/utils/dependency_cache.py +2 -2
  829. claude_mpm/utils/dependency_strategies.py +15 -10
  830. claude_mpm/utils/display_helper.py +260 -0
  831. claude_mpm/utils/environment_context.py +4 -3
  832. claude_mpm/utils/error_handler.py +5 -3
  833. claude_mpm/utils/file_utils.py +13 -14
  834. claude_mpm/utils/git_analyzer.py +407 -0
  835. claude_mpm/utils/log_cleanup.py +627 -0
  836. claude_mpm/utils/path_operations.py +7 -4
  837. claude_mpm/utils/robust_installer.py +133 -24
  838. claude_mpm/utils/session_logging.py +2 -2
  839. claude_mpm/utils/subprocess_utils.py +9 -8
  840. claude_mpm/validation/agent_validator.py +6 -6
  841. claude_mpm/validation/frontmatter_validator.py +6 -6
  842. claude_mpm-4.24.0.dist-info/METADATA +675 -0
  843. claude_mpm-4.24.0.dist-info/RECORD +1018 -0
  844. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
  845. claude_mpm/agents/INSTRUCTIONS.md +0 -237
  846. claude_mpm/agents/schema/agent_schema.json +0 -314
  847. claude_mpm/agents/templates/agent-manager.md +0 -304
  848. claude_mpm/cli/commands/configure_tui.py +0 -1921
  849. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  850. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  851. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  852. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  853. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  854. claude_mpm/scripts/socketio_server_manager.py +0 -349
  855. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  856. claude_mpm/services/cli/dashboard_launcher.py +0 -424
  857. claude_mpm/services/cli/socketio_manager.py +0 -498
  858. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  859. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  860. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  861. claude_mpm/services/project/analyzer_refactored.py +0 -450
  862. claude_mpm-4.1.6.dist-info/METADATA +0 -325
  863. claude_mpm-4.1.6.dist-info/RECORD +0 -550
  864. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
  865. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
  866. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1005 @@
1
+ """
2
+ Project Organizer Service for Claude MPM Project Initialization
3
+ ===============================================================
4
+
5
+ This service verifies and creates standard project directory structures
6
+ for optimal Claude Code and Claude MPM usage.
7
+
8
+ Key Features:
9
+ - Standard directory structure verification
10
+ - Missing directory creation with proper permissions
11
+ - .gitignore configuration and updates
12
+ - Temporary directory management
13
+ - Project structure documentation generation
14
+
15
+ Author: Claude MPM Development Team
16
+ Created: 2025-01-26
17
+ """
18
+
19
+ from pathlib import Path
20
+ from typing import ClassVar, Dict, List, Optional, Tuple
21
+
22
+ from rich.console import Console
23
+
24
+ from claude_mpm.core.logging_utils import get_logger
25
+
26
+ logger = get_logger(__name__)
27
+ console = Console()
28
+
29
+
30
+ class ProjectOrganizer:
31
+ """Manages project directory structure and organization."""
32
+
33
+ # Standard directory structure for Claude MPM projects
34
+ STANDARD_DIRECTORIES: ClassVar[dict] = {
35
+ "tmp": "Temporary files, test outputs, and experiments",
36
+ "scripts": "Project scripts and automation tools",
37
+ "docs": "Project documentation",
38
+ "docs/_archive": "Archived documentation versions",
39
+ "tests": "Test suites and test fixtures",
40
+ ".claude-mpm": "Claude MPM configuration and data",
41
+ ".claude-mpm/memories": "Agent memory storage",
42
+ ".claude/agents": "Deployed agent configurations",
43
+ "src": "Source code (for libraries/packages)",
44
+ }
45
+
46
+ # Comprehensive gitignore patterns for Claude MPM projects
47
+ GITIGNORE_DIRS: ClassVar[dict] = {
48
+ # Temporary and cache directories
49
+ "tmp/",
50
+ "temp/",
51
+ "*.tmp",
52
+ "*.temp",
53
+ "*.cache",
54
+ ".claude-mpm/cache/",
55
+ ".claude-mpm/logs/",
56
+ ".claude/cache/",
57
+ # MCP service directories for local data
58
+ ".mcp-vector-search/",
59
+ ".kuzu-memory/",
60
+ "kuzu-memories/", # kuzu-memory database directory
61
+ # Python artifacts
62
+ "__pycache__/",
63
+ "*.py[cod]",
64
+ "*$py.class",
65
+ "*.so",
66
+ ".Python",
67
+ "*.egg-info/",
68
+ "*.egg",
69
+ "dist/",
70
+ "build/",
71
+ "develop-eggs/",
72
+ ".eggs/",
73
+ "wheels/",
74
+ "pip-wheel-metadata/",
75
+ "*.manifest",
76
+ "*.spec",
77
+ # Testing and coverage
78
+ ".pytest_cache/",
79
+ ".coverage",
80
+ ".coverage.*",
81
+ "htmlcov/",
82
+ ".tox/",
83
+ ".nox/",
84
+ "*.cover",
85
+ ".hypothesis/",
86
+ ".pytype/",
87
+ "coverage.xml",
88
+ "*.pytest_cache",
89
+ # Virtual environments
90
+ ".env",
91
+ ".venv",
92
+ "env/",
93
+ "venv/",
94
+ "ENV/",
95
+ "env.bak/",
96
+ "venv.bak/",
97
+ "virtualenv/",
98
+ ".conda/",
99
+ "conda-env/",
100
+ # IDE and editor files
101
+ ".vscode/",
102
+ ".idea/",
103
+ "*.swp",
104
+ "*.swo",
105
+ "*~",
106
+ ".project",
107
+ ".pydevproject",
108
+ ".settings/",
109
+ "*.sublime-workspace",
110
+ "*.sublime-project",
111
+ # OS-specific files
112
+ ".DS_Store",
113
+ "Thumbs.db",
114
+ "ehthumbs.db",
115
+ "Desktop.ini",
116
+ "$RECYCLE.BIN/",
117
+ "*.cab",
118
+ "*.msi",
119
+ "*.msm",
120
+ "*.msp",
121
+ "*.lnk",
122
+ # Logs and databases
123
+ "*.log",
124
+ "*.sql",
125
+ "*.sqlite",
126
+ "*.sqlite3",
127
+ "*.db",
128
+ "logs/",
129
+ # Node/JavaScript
130
+ "node_modules/",
131
+ "npm-debug.log*",
132
+ "yarn-debug.log*",
133
+ "yarn-error.log*",
134
+ ".npm",
135
+ ".yarn/",
136
+ # Documentation builds
137
+ "_build/",
138
+ "site/",
139
+ "docs/_build/",
140
+ # Security and credentials
141
+ ".env.*",
142
+ "*.pem",
143
+ "*.key",
144
+ "*.cert",
145
+ "*.crt",
146
+ ".secrets/",
147
+ "credentials/",
148
+ # Claude MPM specific
149
+ ".claude-mpm/*.log",
150
+ ".claude-mpm/sessions/",
151
+ ".claude-mpm/tmp/",
152
+ ".claude/sessions/",
153
+ "*.mpm.tmp",
154
+ # Backup files
155
+ "*.bak",
156
+ "*.backup",
157
+ "*.old",
158
+ "backup/",
159
+ "backups/",
160
+ }
161
+
162
+ # Project type specific structures
163
+ PROJECT_STRUCTURES: ClassVar[dict] = {
164
+ "web": ["public", "src/components", "src/pages", "src/styles"],
165
+ "api": ["src/routes", "src/models", "src/middleware", "src/services"],
166
+ "cli": ["src/commands", "src/utils", "src/config"],
167
+ "library": ["src", "examples", "benchmarks"],
168
+ "mobile": ["src/screens", "src/components", "src/services", "assets"],
169
+ "fullstack": ["frontend", "backend", "shared", "infrastructure"],
170
+ }
171
+
172
+ def __init__(self, project_path: Path):
173
+ """Initialize the project organizer."""
174
+ self.project_path = project_path
175
+ self.gitignore_path = project_path / ".gitignore"
176
+ self.structure_report = {}
177
+
178
+ def verify_structure(self, project_type: Optional[str] = None) -> Dict:
179
+ """Verify project structure and identify missing components."""
180
+ report = {
181
+ "project_path": str(self.project_path),
182
+ "exists": [],
183
+ "missing": [],
184
+ "issues": [],
185
+ "recommendations": [],
186
+ }
187
+
188
+ # Check standard directories
189
+ for dir_name, description in self.STANDARD_DIRECTORIES.items():
190
+ dir_path = self.project_path / dir_name
191
+ if dir_path.exists():
192
+ report["exists"].append(
193
+ {
194
+ "path": dir_name,
195
+ "description": description,
196
+ "is_directory": dir_path.is_dir(),
197
+ }
198
+ )
199
+ else:
200
+ report["missing"].append(
201
+ {
202
+ "path": dir_name,
203
+ "description": description,
204
+ "required": self._is_required_directory(dir_name, project_type),
205
+ }
206
+ )
207
+
208
+ # Check project-type specific directories
209
+ if project_type and project_type in self.PROJECT_STRUCTURES:
210
+ for dir_name in self.PROJECT_STRUCTURES[project_type]:
211
+ dir_path = self.project_path / dir_name
212
+ if not dir_path.exists():
213
+ report["missing"].append(
214
+ {
215
+ "path": dir_name,
216
+ "description": f"{project_type} specific directory",
217
+ "required": False,
218
+ }
219
+ )
220
+
221
+ # Check for common issues
222
+ report["issues"] = self._check_common_issues()
223
+
224
+ # Generate recommendations
225
+ report["recommendations"] = self._generate_recommendations(report)
226
+
227
+ self.structure_report = report
228
+ return report
229
+
230
+ def _is_required_directory(
231
+ self, dir_name: str, project_type: Optional[str]
232
+ ) -> bool:
233
+ """Determine if a directory is required for the project."""
234
+ # Always required directories
235
+ always_required = {"tmp", "scripts", "docs"}
236
+ if dir_name in always_required:
237
+ return True
238
+
239
+ # Type-specific requirements
240
+ if project_type:
241
+ if project_type in ["library", "package"] and dir_name == "src":
242
+ return True
243
+ if project_type in ["web", "api", "fullstack"] and dir_name == "tests":
244
+ return True
245
+
246
+ return False
247
+
248
+ def _check_common_issues(self) -> List[Dict]:
249
+ """Check for common project organization issues."""
250
+ issues = []
251
+
252
+ # Check for files in wrong locations
253
+ root_files = list(self.project_path.glob("*.py"))
254
+ test_files_in_root = [f for f in root_files if "test" in f.name.lower()]
255
+ if test_files_in_root:
256
+ issues.append(
257
+ {
258
+ "type": "misplaced_tests",
259
+ "description": "Test files found in project root",
260
+ "files": [str(f.name) for f in test_files_in_root],
261
+ "recommendation": "Move test files to tests/ directory",
262
+ }
263
+ )
264
+
265
+ script_files_in_root = [
266
+ f
267
+ for f in root_files
268
+ if f.name.lower().endswith((".sh", ".bash", ".py"))
269
+ and not f.name.startswith(".")
270
+ and f.name not in ["setup.py", "pyproject.toml"]
271
+ ]
272
+ if script_files_in_root:
273
+ issues.append(
274
+ {
275
+ "type": "misplaced_scripts",
276
+ "description": "Script files found in project root",
277
+ "files": [
278
+ str(f.name) for f in script_files_in_root[:5]
279
+ ], # Limit to 5
280
+ "recommendation": "Move scripts to scripts/ directory",
281
+ }
282
+ )
283
+
284
+ # Check for missing .gitignore
285
+ if not self.gitignore_path.exists():
286
+ issues.append(
287
+ {
288
+ "type": "missing_gitignore",
289
+ "description": "No .gitignore file found",
290
+ "recommendation": "Create .gitignore with standard patterns",
291
+ }
292
+ )
293
+ else:
294
+ # Check .gitignore completeness
295
+ gitignore_content = self.gitignore_path.read_text()
296
+ missing_patterns = []
297
+ for pattern in ["tmp/", "__pycache__", ".env", "*.log"]:
298
+ if pattern not in gitignore_content:
299
+ missing_patterns.append(pattern)
300
+
301
+ if missing_patterns:
302
+ issues.append(
303
+ {
304
+ "type": "incomplete_gitignore",
305
+ "description": "Common patterns missing from .gitignore",
306
+ "patterns": missing_patterns,
307
+ "recommendation": "Update .gitignore with missing patterns",
308
+ }
309
+ )
310
+
311
+ # Check for large files that should be in tmp
312
+ large_files = []
313
+ for file in self.project_path.rglob("*"):
314
+ if file.is_file() and not any(part.startswith(".") for part in file.parts):
315
+ try:
316
+ size_mb = file.stat().st_size / (1024 * 1024)
317
+ if size_mb > 10: # Files larger than 10MB
318
+ if "tmp" not in str(file) and "node_modules" not in str(file):
319
+ large_files.append(
320
+ {
321
+ "path": str(file.relative_to(self.project_path)),
322
+ "size_mb": round(size_mb, 2),
323
+ }
324
+ )
325
+ except (OSError, PermissionError):
326
+ continue
327
+
328
+ if large_files:
329
+ issues.append(
330
+ {
331
+ "type": "large_files",
332
+ "description": "Large files outside tmp/ directory",
333
+ "files": large_files[:5], # Limit to 5
334
+ "recommendation": "Consider moving large files to tmp/ or adding to .gitignore",
335
+ }
336
+ )
337
+
338
+ return issues
339
+
340
+ def _generate_recommendations(self, report: Dict) -> List[str]:
341
+ """Generate recommendations based on verification report."""
342
+ recommendations = []
343
+
344
+ # Recommend creating missing required directories
345
+ required_missing = [d for d in report["missing"] if d.get("required")]
346
+ if required_missing:
347
+ recommendations.append(
348
+ f"Create {len(required_missing)} required directories: "
349
+ + ", ".join(d["path"] for d in required_missing)
350
+ )
351
+
352
+ # Recommend fixing issues
353
+ if report["issues"]:
354
+ for issue in report["issues"]:
355
+ recommendations.append(issue["recommendation"])
356
+
357
+ # Recommend documentation
358
+ if "docs" not in [d["path"] for d in report["exists"]]:
359
+ recommendations.append("Create docs/ directory for project documentation")
360
+
361
+ return recommendations
362
+
363
+ def create_missing_directories(self, force: bool = False) -> Dict:
364
+ """Create missing standard directories."""
365
+ created = []
366
+ skipped = []
367
+ errors = []
368
+
369
+ report = self.verify_structure()
370
+
371
+ for dir_info in report["missing"]:
372
+ dir_path = self.project_path / dir_info["path"]
373
+
374
+ # Skip non-required unless force
375
+ if not dir_info.get("required") and not force:
376
+ skipped.append(dir_info["path"])
377
+ continue
378
+
379
+ try:
380
+ dir_path.mkdir(parents=True, exist_ok=True)
381
+ created.append(dir_info["path"])
382
+ logger.info(f"Created directory: {dir_path}")
383
+
384
+ # Add README for certain directories
385
+ self._add_directory_readme(dir_path, dir_info["description"])
386
+
387
+ except Exception as e:
388
+ errors.append({"path": dir_info["path"], "error": str(e)})
389
+ logger.error(f"Failed to create {dir_path}: {e}")
390
+
391
+ return {
392
+ "created": created,
393
+ "skipped": skipped,
394
+ "errors": errors,
395
+ }
396
+
397
+ def _add_directory_readme(self, dir_path: Path, description: str) -> None:
398
+ """Add README file to newly created directory."""
399
+ readme_path = dir_path / "README.md"
400
+
401
+ # Only add README for certain directories
402
+ readme_dirs = ["tmp", "scripts", "docs/_archive", ".claude-mpm/memories"]
403
+ if any(str(dir_path).endswith(d) for d in readme_dirs):
404
+ if not readme_path.exists():
405
+ content = f"""# {dir_path.name}
406
+
407
+ {description}
408
+
409
+ ## Purpose
410
+
411
+ This directory is used for {description.lower()}.
412
+
413
+ ## Usage Guidelines
414
+
415
+ """
416
+ if "tmp" in str(dir_path):
417
+ content += """- Place all temporary files and test outputs here
418
+ - This directory is gitignored - contents will not be committed
419
+ - Clean up old files periodically to save disk space
420
+ - Use subdirectories to organize different types of temporary files
421
+ """
422
+ elif "scripts" in str(dir_path):
423
+ content += """- All project scripts should be placed here
424
+ - Use descriptive names for scripts
425
+ - Include comments and usage instructions in scripts
426
+ - Make scripts executable with `chmod +x script_name.sh`
427
+ """
428
+ elif "_archive" in str(dir_path):
429
+ content += """- Archived documentation versions are stored here
430
+ - Files are timestamped when archived
431
+ - Preserve important historical documentation
432
+ - Review and clean up old archives periodically
433
+ """
434
+ elif "memories" in str(dir_path):
435
+ content += """- Agent memory files are stored here
436
+ - Each agent can have its own memory file
437
+ - Memories persist between sessions
438
+ - Update memories when project knowledge changes
439
+ """
440
+
441
+ readme_path.write_text(content)
442
+ logger.debug(f"Created README in {dir_path}")
443
+
444
+ def update_gitignore(self, additional_patterns: Optional[List[str]] = None) -> bool:
445
+ """Update or create .gitignore file with standard patterns."""
446
+ try:
447
+ # Read existing content
448
+ existing_patterns = set()
449
+ if self.gitignore_path.exists():
450
+ content = self.gitignore_path.read_text()
451
+ existing_patterns = {
452
+ line.strip()
453
+ for line in content.splitlines()
454
+ if line.strip() and not line.startswith("#")
455
+ }
456
+ else:
457
+ content = ""
458
+
459
+ # Combine all patterns
460
+ all_patterns = self.GITIGNORE_DIRS.copy()
461
+ if additional_patterns:
462
+ all_patterns.update(additional_patterns)
463
+
464
+ # Find missing patterns
465
+ missing = all_patterns - existing_patterns
466
+
467
+ if missing:
468
+ # Add section for new patterns
469
+ new_section = "\n# Added by Claude MPM /mpm-init\n"
470
+ for pattern in sorted(missing):
471
+ new_section += f"{pattern}\n"
472
+
473
+ # Append to file
474
+ if content and not content.endswith("\n"):
475
+ content += "\n"
476
+ content += new_section
477
+
478
+ # Write updated content
479
+ self.gitignore_path.write_text(content)
480
+ logger.info(f"Updated .gitignore with {len(missing)} patterns")
481
+ return True
482
+ logger.info(".gitignore already contains all standard patterns")
483
+ return False
484
+
485
+ except Exception as e:
486
+ logger.error(f"Failed to update .gitignore: {e}")
487
+ return False
488
+
489
+ def organize_misplaced_files(
490
+ self, dry_run: bool = True, auto_safe: bool = True
491
+ ) -> Dict:
492
+ """Organize misplaced files into proper directories.
493
+
494
+ Args:
495
+ dry_run: If True, only report what would be moved without moving
496
+ auto_safe: If True, only move files that are clearly safe to move
497
+ """
498
+ moves = []
499
+ skipped = []
500
+ errors = []
501
+
502
+ # Files that should never be moved from root
503
+ protected_root_files = {
504
+ "setup.py",
505
+ "pyproject.toml",
506
+ "package.json",
507
+ "package-lock.json",
508
+ "requirements.txt",
509
+ "Pipfile",
510
+ "Pipfile.lock",
511
+ "poetry.lock",
512
+ "Makefile",
513
+ "makefile",
514
+ "Dockerfile",
515
+ "docker-compose.yml",
516
+ ".gitignore",
517
+ ".gitattributes",
518
+ "LICENSE",
519
+ "README.md",
520
+ "README.rst",
521
+ "CHANGELOG.md",
522
+ "CONTRIBUTING.md",
523
+ "CODE_OF_CONDUCT.md",
524
+ "CLAUDE.md",
525
+ "CODE.md",
526
+ "DEVELOPER.md",
527
+ "STRUCTURE.md",
528
+ "OPS.md",
529
+ ".env.example",
530
+ ".env.sample",
531
+ "VERSION",
532
+ "BUILD_NUMBER",
533
+ }
534
+
535
+ # Scan root directory for misplaced files
536
+ root_files = list(self.project_path.glob("*"))
537
+ for file in root_files:
538
+ if file.is_file() and file.name not in protected_root_files:
539
+ target_dir = None
540
+ confidence = "low" # low, medium, high
541
+ reason = ""
542
+
543
+ # Determine target directory based on file patterns
544
+ file_lower = file.name.lower()
545
+
546
+ # Test files (high confidence)
547
+ if "test" in file_lower and file.suffix == ".py":
548
+ if file_lower.startswith("test_") or file_lower.endswith(
549
+ "_test.py"
550
+ ):
551
+ target_dir = "tests"
552
+ confidence = "high"
553
+ reason = "Test file pattern detected"
554
+
555
+ # Script files (medium-high confidence)
556
+ elif file.suffix in [".sh", ".bash"]:
557
+ target_dir = "scripts"
558
+ confidence = "high"
559
+ reason = "Shell script file"
560
+ elif file.suffix == ".py" and any(
561
+ pattern in file_lower
562
+ for pattern in ["script", "run", "cli", "tool"]
563
+ ):
564
+ target_dir = "scripts"
565
+ confidence = "medium"
566
+ reason = "Python script pattern detected"
567
+
568
+ # Log and temporary files (high confidence)
569
+ elif file.suffix in [".log", ".tmp", ".temp", ".cache"]:
570
+ target_dir = "tmp"
571
+ confidence = "high"
572
+ reason = "Temporary/log file"
573
+ elif file_lower.startswith(("tmp_", "temp_", "test_output", "debug_")):
574
+ target_dir = "tmp"
575
+ confidence = "high"
576
+ reason = "Temporary file pattern"
577
+
578
+ # Documentation files (medium confidence)
579
+ elif (
580
+ file.suffix in [".md", ".rst", ".txt"]
581
+ and file.name not in protected_root_files
582
+ ):
583
+ if any(
584
+ pattern in file_lower
585
+ for pattern in ["notes", "draft", "todo", "spec", "design"]
586
+ ):
587
+ target_dir = "docs"
588
+ confidence = "medium"
589
+ reason = "Documentation file pattern"
590
+
591
+ # Data files (medium confidence)
592
+ elif file.suffix in [".csv", ".json", ".xml", ".yaml", ".yml"]:
593
+ if file.suffix in [".yaml", ".yml"] and any(
594
+ pattern in file_lower for pattern in ["config", "settings"]
595
+ ):
596
+ # Config files might belong in root
597
+ confidence = "low"
598
+ else:
599
+ target_dir = "data"
600
+ confidence = "medium"
601
+ reason = "Data file"
602
+
603
+ # Build artifacts (high confidence)
604
+ elif file.suffix in [".whl", ".tar.gz", ".zip"] and "dist" not in str(
605
+ file.parent
606
+ ):
607
+ target_dir = "dist"
608
+ confidence = "high"
609
+ reason = "Build artifact"
610
+
611
+ # Example files (medium confidence)
612
+ elif "example" in file_lower or "sample" in file_lower:
613
+ target_dir = "examples"
614
+ confidence = "medium"
615
+ reason = "Example file pattern"
616
+
617
+ if target_dir:
618
+ # Check if we should move based on confidence and auto_safe setting
619
+ should_move = (
620
+ (confidence == "high")
621
+ if auto_safe
622
+ else (confidence in ["high", "medium"])
623
+ )
624
+
625
+ if should_move:
626
+ target_path = self.project_path / target_dir / file.name
627
+ moves.append(
628
+ {
629
+ "source": str(file.relative_to(self.project_path)),
630
+ "target": str(
631
+ target_path.relative_to(self.project_path)
632
+ ),
633
+ "reason": reason,
634
+ "confidence": confidence,
635
+ }
636
+ )
637
+
638
+ if not dry_run:
639
+ try:
640
+ # Create target directory if needed
641
+ target_path.parent.mkdir(parents=True, exist_ok=True)
642
+ # Move file
643
+ file.rename(target_path)
644
+ logger.info(
645
+ f"Moved {file.name} to {target_dir}/ ({reason})"
646
+ )
647
+ except Exception as e:
648
+ errors.append({"file": str(file.name), "error": str(e)})
649
+ logger.error(f"Failed to move {file.name}: {e}")
650
+ else:
651
+ skipped.append(
652
+ {
653
+ "file": str(file.name),
654
+ "suggested_dir": target_dir,
655
+ "confidence": confidence,
656
+ "reason": "Low confidence move - skipped (use --no-auto-safe to include)",
657
+ }
658
+ )
659
+
660
+ # Also check for deeply nested test files that should be in tests/
661
+ if not auto_safe: # Only in non-safe mode
662
+ for test_file in self.project_path.rglob("*test*.py"):
663
+ # Skip if already in tests directory
664
+ if "tests" in test_file.parts or "test" in test_file.parts:
665
+ continue
666
+ # Skip if in node_modules or venv
667
+ if any(
668
+ part in test_file.parts
669
+ for part in ["node_modules", "venv", ".venv", "site-packages"]
670
+ ):
671
+ continue
672
+
673
+ target_path = self.project_path / "tests" / test_file.name
674
+ moves.append(
675
+ {
676
+ "source": str(test_file.relative_to(self.project_path)),
677
+ "target": str(target_path.relative_to(self.project_path)),
678
+ "reason": "Test file found outside tests directory",
679
+ "confidence": "medium",
680
+ }
681
+ )
682
+
683
+ if not dry_run:
684
+ try:
685
+ target_path.parent.mkdir(parents=True, exist_ok=True)
686
+ test_file.rename(target_path)
687
+ logger.info(f"Moved {test_file.name} to tests/")
688
+ except Exception as e:
689
+ errors.append(
690
+ {
691
+ "file": str(test_file.relative_to(self.project_path)),
692
+ "error": str(e),
693
+ }
694
+ )
695
+
696
+ return {
697
+ "dry_run": dry_run,
698
+ "auto_safe": auto_safe,
699
+ "proposed_moves": moves if dry_run else [],
700
+ "completed_moves": [] if dry_run else moves,
701
+ "skipped": skipped,
702
+ "errors": errors,
703
+ "total": len(moves),
704
+ "total_skipped": len(skipped),
705
+ "total_errors": len(errors),
706
+ }
707
+
708
+ def generate_structure_documentation(self) -> str:
709
+ """Generate markdown documentation of project structure."""
710
+ doc = """# Project Structure Report
711
+
712
+ ## Structure Validation
713
+
714
+ """
715
+ # Add validation summary
716
+ validation = self.validate_structure()
717
+ doc += f"**Overall Grade:** {validation.get('grade', 'Not evaluated')}\n"
718
+ doc += f"**Score:** {validation.get('score', 0)}/100\n\n"
719
+
720
+ if validation["errors"]:
721
+ doc += "### 🔴 Critical Issues\n"
722
+ for error in validation["errors"]:
723
+ doc += f"- {error}\n"
724
+ doc += "\n"
725
+
726
+ if validation["warnings"]:
727
+ doc += "### ⚠️ Warnings\n"
728
+ for warning in validation["warnings"]:
729
+ doc += f"- {warning}\n"
730
+ doc += "\n"
731
+
732
+ doc += "## Directory Organization\n\n"
733
+
734
+ # Document existing structure
735
+ for dir_name, description in self.STANDARD_DIRECTORIES.items():
736
+ dir_path = self.project_path / dir_name
737
+ if dir_path.exists():
738
+ doc += f"### ✅ `{dir_name}/`\n{description}\n\n"
739
+
740
+ # List some contents
741
+ try:
742
+ contents = list(dir_path.iterdir())[:5]
743
+ if contents:
744
+ doc += "**Contents:**\n"
745
+ for item in contents:
746
+ if item.is_dir():
747
+ doc += f"- {item.name}/ (directory)\n"
748
+ else:
749
+ doc += f"- {item.name}\n"
750
+ if len(list(dir_path.iterdir())) > 5:
751
+ doc += f"- ... and {len(list(dir_path.iterdir())) - 5} more items\n"
752
+ doc += "\n"
753
+ except PermissionError:
754
+ doc += "*Permission denied to list contents*\n\n"
755
+ else:
756
+ doc += f"### ❌ `{dir_name}/` (Missing)\n{description}\n\n"
757
+
758
+ # Document misplaced files
759
+ organize_result = self.organize_misplaced_files(dry_run=True, auto_safe=True)
760
+ if organize_result["proposed_moves"]:
761
+ doc += "## 📦 Files to Reorganize\n\n"
762
+ doc += "The following files could be better organized:\n\n"
763
+ for move in organize_result["proposed_moves"][:10]: # Limit to 10
764
+ doc += f"- `{move['source']}` → `{move['target']}`\n"
765
+ doc += f" - Reason: {move['reason']}\n"
766
+ doc += f" - Confidence: {move['confidence']}\n"
767
+ if len(organize_result["proposed_moves"]) > 10:
768
+ doc += f"\n... and {len(organize_result['proposed_moves']) - 10} more files\n"
769
+ doc += "\n"
770
+
771
+ # Document gitignore status
772
+ doc += "## .gitignore Configuration\n\n"
773
+ if self.gitignore_path.exists():
774
+ gitignore_content = self.gitignore_path.read_text()
775
+ critical_patterns = [
776
+ "tmp/",
777
+ "__pycache__",
778
+ ".env",
779
+ "*.log",
780
+ ".claude-mpm/cache/",
781
+ ]
782
+ doc += "### Critical Patterns Status:\n"
783
+ for pattern in critical_patterns:
784
+ status = "✅" if pattern in gitignore_content else "❌"
785
+ doc += f"- {status} `{pattern}`\n"
786
+ doc += "\n"
787
+ else:
788
+ doc += "❌ No .gitignore file found\n\n"
789
+
790
+ # Add recommendations
791
+ if self.structure_report and self.structure_report.get("recommendations"):
792
+ doc += "## 💡 Recommendations\n\n"
793
+ for rec in self.structure_report["recommendations"]:
794
+ doc += f"- {rec}\n"
795
+ doc += "\n"
796
+
797
+ # Add quick fix commands
798
+ doc += "## 🛠️ Quick Fix Commands\n\n"
799
+ doc += "```bash\n"
800
+ doc += "# Run complete initialization\n"
801
+ doc += "claude-mpm mpm-init --organize\n\n"
802
+ doc += "# Review without changes\n"
803
+ doc += "claude-mpm mpm-init --review\n\n"
804
+ doc += "# Update existing documentation\n"
805
+ doc += "claude-mpm mpm-init --update\n"
806
+ doc += "```\n"
807
+
808
+ return doc
809
+
810
+ def generate_structure_report_json(self) -> Dict:
811
+ """Generate a comprehensive JSON structure report."""
812
+ validation = self.validate_structure()
813
+ organize_result = self.organize_misplaced_files(dry_run=True, auto_safe=True)
814
+
815
+ report = {
816
+ "timestamp": str(Path.cwd()),
817
+ "project_path": str(self.project_path),
818
+ "validation": validation,
819
+ "directories": {},
820
+ "misplaced_files": organize_result,
821
+ "gitignore": {
822
+ "exists": self.gitignore_path.exists(),
823
+ "patterns_status": {},
824
+ },
825
+ "statistics": {
826
+ "total_directories": 0,
827
+ "total_files": 0,
828
+ "misplaced_files": len(organize_result.get("proposed_moves", [])),
829
+ "structure_score": validation.get("score", 0),
830
+ },
831
+ }
832
+
833
+ # Check directory status
834
+ for dir_name, description in self.STANDARD_DIRECTORIES.items():
835
+ dir_path = self.project_path / dir_name
836
+ report["directories"][dir_name] = {
837
+ "exists": dir_path.exists(),
838
+ "description": description,
839
+ "file_count": len(list(dir_path.glob("*"))) if dir_path.exists() else 0,
840
+ "is_directory": dir_path.is_dir() if dir_path.exists() else None,
841
+ }
842
+ if dir_path.exists():
843
+ report["statistics"]["total_directories"] += 1
844
+
845
+ # Check gitignore patterns
846
+ if self.gitignore_path.exists():
847
+ gitignore_content = self.gitignore_path.read_text()
848
+ critical_patterns = [
849
+ "tmp/",
850
+ "__pycache__",
851
+ ".env",
852
+ "*.log",
853
+ ".claude-mpm/cache/",
854
+ ]
855
+ for pattern in critical_patterns:
856
+ report["gitignore"]["patterns_status"][pattern] = (
857
+ pattern in gitignore_content
858
+ )
859
+
860
+ # Count total files
861
+ for item in self.project_path.rglob("*"):
862
+ if item.is_file():
863
+ report["statistics"]["total_files"] += 1
864
+
865
+ return report
866
+
867
+ def ensure_project_ready(
868
+ self, auto_organize: bool = False, safe_mode: bool = True
869
+ ) -> Tuple[bool, List[str]]:
870
+ """Ensure project is ready for Claude MPM usage.
871
+
872
+ Args:
873
+ auto_organize: Automatically organize misplaced files
874
+ safe_mode: Only perform safe operations
875
+ """
876
+ actions_taken = []
877
+ issues_found = []
878
+
879
+ # Verify structure first
880
+ self.verify_structure()
881
+
882
+ # Create required directories
883
+ result = self.create_missing_directories(force=False)
884
+ if result["created"]:
885
+ actions_taken.append(f"Created {len(result['created'])} directories")
886
+
887
+ # Create tmp directory with proper README if it doesn't exist
888
+ tmp_dir = self.project_path / "tmp"
889
+ if not tmp_dir.exists():
890
+ tmp_dir.mkdir(parents=True, exist_ok=True)
891
+ self._add_directory_readme(
892
+ tmp_dir, "Temporary files, test outputs, and experiments"
893
+ )
894
+ actions_taken.append("Created tmp/ directory with README")
895
+
896
+ # Update .gitignore with comprehensive patterns
897
+ if self.update_gitignore():
898
+ actions_taken.append("Updated .gitignore with comprehensive patterns")
899
+
900
+ # Check if organization is needed
901
+ organize_result = self.organize_misplaced_files(
902
+ dry_run=True, auto_safe=safe_mode
903
+ )
904
+ if organize_result["proposed_moves"]:
905
+ if auto_organize:
906
+ # Perform the organization
907
+ actual_result = self.organize_misplaced_files(
908
+ dry_run=False, auto_safe=safe_mode
909
+ )
910
+ if actual_result["completed_moves"]:
911
+ actions_taken.append(
912
+ f"Organized {len(actual_result['completed_moves'])} files into proper directories"
913
+ )
914
+ if actual_result["errors"]:
915
+ issues_found.append(
916
+ f"Failed to move {len(actual_result['errors'])} files"
917
+ )
918
+ else:
919
+ actions_taken.append(
920
+ f"Identified {len(organize_result['proposed_moves'])} files to reorganize (use --organize to move)"
921
+ )
922
+ if organize_result["skipped"]:
923
+ actions_taken.append(
924
+ f"Skipped {len(organize_result['skipped'])} low-confidence moves"
925
+ )
926
+
927
+ # Check for remaining issues
928
+ if self.structure_report.get("issues"):
929
+ for issue in self.structure_report["issues"]:
930
+ if issue["type"] not in [
931
+ "misplaced_scripts",
932
+ "misplaced_tests",
933
+ ]: # These may be handled
934
+ issues_found.append(issue["description"])
935
+
936
+ # Generate structure validation report
937
+ validation_report = self.validate_structure()
938
+ if not validation_report["is_valid"]:
939
+ issues_found.extend(validation_report["errors"])
940
+
941
+ ready = len(issues_found) == 0
942
+ return ready, actions_taken
943
+
944
+ def validate_structure(self) -> Dict:
945
+ """Validate the project structure meets Claude MPM standards."""
946
+ validation = {
947
+ "is_valid": True,
948
+ "errors": [],
949
+ "warnings": [],
950
+ "score": 100,
951
+ }
952
+
953
+ # Check critical directories exist
954
+ critical_dirs = ["tmp", "scripts", "docs"]
955
+ for dir_name in critical_dirs:
956
+ if not (self.project_path / dir_name).exists():
957
+ validation["is_valid"] = False
958
+ validation["errors"].append(f"Missing critical directory: {dir_name}/")
959
+ validation["score"] -= 10
960
+
961
+ # Check .gitignore completeness
962
+ if not self.gitignore_path.exists():
963
+ validation["is_valid"] = False
964
+ validation["errors"].append("No .gitignore file found")
965
+ validation["score"] -= 15
966
+ else:
967
+ gitignore_content = self.gitignore_path.read_text()
968
+ critical_patterns = ["tmp/", "__pycache__", ".env", "*.log"]
969
+ for pattern in critical_patterns:
970
+ if pattern not in gitignore_content:
971
+ validation["warnings"].append(
972
+ f"Missing gitignore pattern: {pattern}"
973
+ )
974
+ validation["score"] -= 2
975
+
976
+ # Check for files in wrong locations
977
+ root_files = list(self.project_path.glob("*"))
978
+ misplaced_count = 0
979
+ for file in root_files:
980
+ if file.is_file() and (
981
+ ("test" in file.name.lower() and file.suffix == ".py")
982
+ or (file.suffix in [".sh", ".bash"] and file.name not in ["Makefile"])
983
+ or file.suffix in [".log", ".tmp", ".cache"]
984
+ ):
985
+ misplaced_count += 1
986
+
987
+ if misplaced_count > 0:
988
+ validation["warnings"].append(
989
+ f"{misplaced_count} files potentially misplaced in root"
990
+ )
991
+ validation["score"] -= min(misplaced_count * 2, 20)
992
+
993
+ # Score interpretation
994
+ if validation["score"] >= 90:
995
+ validation["grade"] = "A - Excellent structure"
996
+ elif validation["score"] >= 80:
997
+ validation["grade"] = "B - Good structure"
998
+ elif validation["score"] >= 70:
999
+ validation["grade"] = "C - Acceptable structure"
1000
+ elif validation["score"] >= 60:
1001
+ validation["grade"] = "D - Needs improvement"
1002
+ else:
1003
+ validation["grade"] = "F - Poor structure"
1004
+
1005
+ return validation