claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (520) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +35 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +37 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +924 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  41. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  42. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  44. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  46. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  47. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  48. claude_mpm/cli/commands/postmortem.py +401 -0
  49. claude_mpm/cli/commands/run.py +125 -167
  50. claude_mpm/cli/commands/skill_source.py +694 -0
  51. claude_mpm/cli/commands/skills.py +835 -44
  52. claude_mpm/cli/executor.py +78 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +256 -4
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  57. claude_mpm/cli/parsers/base_parser.py +53 -0
  58. claude_mpm/cli/parsers/config_parser.py +96 -43
  59. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +145 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +564 -108
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  68. claude_mpm/commands/mpm-agents-detect.md +9 -0
  69. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  70. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  71. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  72. claude_mpm/commands/mpm-doctor.md +9 -0
  73. claude_mpm/commands/mpm-help.md +17 -2
  74. claude_mpm/commands/mpm-init.md +28 -3
  75. claude_mpm/commands/mpm-monitor.md +9 -0
  76. claude_mpm/commands/mpm-postmortem.md +123 -0
  77. claude_mpm/commands/mpm-session-resume.md +381 -0
  78. claude_mpm/commands/mpm-status.md +9 -0
  79. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  80. claude_mpm/commands/mpm-ticket-view.md +552 -0
  81. claude_mpm/commands/mpm-version.md +9 -0
  82. claude_mpm/commands/mpm.md +11 -0
  83. claude_mpm/config/agent_presets.py +488 -0
  84. claude_mpm/config/agent_sources.py +325 -0
  85. claude_mpm/config/skill_presets.py +392 -0
  86. claude_mpm/config/skill_sources.py +590 -0
  87. claude_mpm/constants.py +13 -0
  88. claude_mpm/core/api_validator.py +1 -1
  89. claude_mpm/core/claude_runner.py +19 -35
  90. claude_mpm/core/config.py +24 -0
  91. claude_mpm/core/constants.py +1 -1
  92. claude_mpm/core/framework/__init__.py +3 -16
  93. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  94. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  95. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  96. claude_mpm/core/hook_error_memory.py +381 -0
  97. claude_mpm/core/hook_manager.py +41 -2
  98. claude_mpm/core/interactive_session.py +131 -10
  99. claude_mpm/core/interfaces.py +56 -1
  100. claude_mpm/core/logger.py +3 -1
  101. claude_mpm/core/oneshot_session.py +110 -8
  102. claude_mpm/core/protocols/__init__.py +23 -0
  103. claude_mpm/core/protocols/runner_protocol.py +103 -0
  104. claude_mpm/core/protocols/session_protocol.py +131 -0
  105. claude_mpm/core/shared/singleton_manager.py +11 -4
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_config.py +22 -0
  108. claude_mpm/dashboard/static/css/activity.css +69 -69
  109. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  110. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  111. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  112. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  114. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  117. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  119. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  120. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  121. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  122. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  123. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  124. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  125. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  126. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  127. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  128. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  129. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  130. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  131. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  132. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  133. claude_mpm/dashboard/templates/code_simple.html +23 -23
  134. claude_mpm/dashboard/templates/index.html +18 -18
  135. claude_mpm/experimental/cli_enhancements.py +1 -5
  136. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  143. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  144. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  145. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  152. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  153. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  154. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  155. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  156. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  157. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  158. claude_mpm/models/git_repository.py +198 -0
  159. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +45 -9
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_selection_service.py +484 -0
  164. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  165. claude_mpm/services/agents/cache_git_manager.py +621 -0
  166. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  167. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  168. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  169. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  170. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  171. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  172. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  173. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  174. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  175. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  176. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  177. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  178. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  179. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  180. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  181. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  182. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  183. claude_mpm/services/agents/git_source_manager.py +629 -0
  184. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  185. claude_mpm/services/agents/local_template_manager.py +50 -10
  186. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  187. claude_mpm/services/agents/sources/__init__.py +13 -0
  188. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  189. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  190. claude_mpm/services/agents/startup_sync.py +239 -0
  191. claude_mpm/services/agents/toolchain_detector.py +474 -0
  192. claude_mpm/services/analysis/__init__.py +25 -0
  193. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  194. claude_mpm/services/analysis/postmortem_service.py +765 -0
  195. claude_mpm/services/cli/session_pause_manager.py +504 -0
  196. claude_mpm/services/cli/session_resume_helper.py +36 -16
  197. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  198. claude_mpm/services/command_deployment_service.py +200 -6
  199. claude_mpm/services/core/base.py +31 -11
  200. claude_mpm/services/core/interfaces/__init__.py +1 -3
  201. claude_mpm/services/core/interfaces/health.py +1 -4
  202. claude_mpm/services/core/interfaces.py +56 -1
  203. claude_mpm/services/core/models/__init__.py +2 -11
  204. claude_mpm/services/core/models/agent_config.py +3 -0
  205. claude_mpm/services/core/models/process.py +4 -0
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/diagnostics/models.py +21 -0
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/event_bus/event_bus.py +36 -3
  219. claude_mpm/services/event_bus/relay.py +23 -7
  220. claude_mpm/services/events/consumers/logging.py +1 -2
  221. claude_mpm/services/git/__init__.py +21 -0
  222. claude_mpm/services/git/git_operations_service.py +494 -0
  223. claude_mpm/services/github/__init__.py +21 -0
  224. claude_mpm/services/github/github_cli_service.py +397 -0
  225. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  226. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  227. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  228. claude_mpm/services/instructions/__init__.py +9 -0
  229. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  230. claude_mpm/services/local_ops/__init__.py +5 -13
  231. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  232. claude_mpm/services/local_ops/health_manager.py +1 -4
  233. claude_mpm/services/local_ops/process_manager.py +1 -1
  234. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  235. claude_mpm/services/mcp_config_manager.py +75 -145
  236. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  237. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
  239. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  240. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  241. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  242. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  243. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  244. claude_mpm/services/mcp_service_verifier.py +6 -3
  245. claude_mpm/services/memory/failure_tracker.py +19 -4
  246. claude_mpm/services/memory/optimizer.py +1 -1
  247. claude_mpm/services/model/model_router.py +8 -9
  248. claude_mpm/services/monitor/daemon.py +29 -9
  249. claude_mpm/services/monitor/daemon_manager.py +96 -19
  250. claude_mpm/services/monitor/server.py +2 -2
  251. claude_mpm/services/native_agent_converter.py +356 -0
  252. claude_mpm/services/port_manager.py +1 -1
  253. claude_mpm/services/pr/__init__.py +14 -0
  254. claude_mpm/services/pr/pr_template_service.py +329 -0
  255. claude_mpm/services/project/documentation_manager.py +2 -1
  256. claude_mpm/services/project/project_organizer.py +4 -0
  257. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  258. claude_mpm/services/runner_configuration_service.py +17 -3
  259. claude_mpm/services/self_upgrade_service.py +165 -7
  260. claude_mpm/services/session_management_service.py +16 -4
  261. claude_mpm/services/skills/__init__.py +18 -0
  262. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  263. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  264. claude_mpm/services/skills_config.py +547 -0
  265. claude_mpm/services/skills_deployer.py +955 -0
  266. claude_mpm/services/socketio/handlers/connection.py +1 -1
  267. claude_mpm/services/socketio/handlers/git.py +2 -2
  268. claude_mpm/services/socketio/server/core.py +1 -4
  269. claude_mpm/services/socketio/server/main.py +1 -3
  270. claude_mpm/services/system_instructions_service.py +1 -3
  271. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  272. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  273. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  274. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  275. claude_mpm/services/unified/unified_deployment.py +1 -5
  276. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  277. claude_mpm/services/visualization/__init__.py +1 -5
  278. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  279. claude_mpm/skills/__init__.py +3 -3
  280. claude_mpm/skills/agent_skills_injector.py +42 -49
  281. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  282. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  283. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  284. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  285. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  286. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  287. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  288. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  289. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  290. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  291. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  292. claude_mpm/skills/skills_registry.py +44 -48
  293. claude_mpm/skills/skills_service.py +117 -108
  294. claude_mpm/templates/questions/__init__.py +38 -0
  295. claude_mpm/templates/questions/base.py +193 -0
  296. claude_mpm/templates/questions/pr_strategy.py +311 -0
  297. claude_mpm/templates/questions/project_init.py +385 -0
  298. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  299. claude_mpm/tools/__main__.py +8 -8
  300. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  301. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  302. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  303. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  304. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  305. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  306. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  307. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  308. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  309. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  310. claude_mpm/utils/agent_dependency_loader.py +80 -13
  311. claude_mpm/utils/agent_filters.py +288 -0
  312. claude_mpm/utils/dependency_cache.py +3 -1
  313. claude_mpm/utils/gitignore.py +244 -0
  314. claude_mpm/utils/log_cleanup.py +3 -3
  315. claude_mpm/utils/migration.py +372 -0
  316. claude_mpm/utils/progress.py +387 -0
  317. claude_mpm/utils/robust_installer.py +3 -5
  318. claude_mpm/utils/structured_questions.py +619 -0
  319. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
  320. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
  321. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  322. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  323. claude_mpm/agents/templates/agent-manager.json +0 -273
  324. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  325. claude_mpm/agents/templates/api_qa.json +0 -180
  326. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  327. claude_mpm/agents/templates/clerk-ops.json +0 -235
  328. claude_mpm/agents/templates/code_analyzer.json +0 -101
  329. claude_mpm/agents/templates/content-agent.json +0 -358
  330. claude_mpm/agents/templates/dart_engineer.json +0 -307
  331. claude_mpm/agents/templates/data_engineer.json +0 -225
  332. claude_mpm/agents/templates/documentation.json +0 -211
  333. claude_mpm/agents/templates/engineer.json +0 -210
  334. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  335. claude_mpm/agents/templates/golang_engineer.json +0 -270
  336. claude_mpm/agents/templates/imagemagick.json +0 -264
  337. claude_mpm/agents/templates/java_engineer.json +0 -346
  338. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  339. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  340. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  341. claude_mpm/agents/templates/memory_manager.json +0 -158
  342. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  343. claude_mpm/agents/templates/ops.json +0 -185
  344. claude_mpm/agents/templates/php-engineer.json +0 -281
  345. claude_mpm/agents/templates/product_owner.json +0 -338
  346. claude_mpm/agents/templates/project_organizer.json +0 -140
  347. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  348. claude_mpm/agents/templates/python_engineer.json +0 -387
  349. claude_mpm/agents/templates/qa.json +0 -242
  350. claude_mpm/agents/templates/react_engineer.json +0 -238
  351. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  352. claude_mpm/agents/templates/research.json +0 -188
  353. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  354. claude_mpm/agents/templates/rust_engineer.json +0 -275
  355. claude_mpm/agents/templates/security.json +0 -202
  356. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  357. claude_mpm/agents/templates/ticketing.json +0 -177
  358. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  359. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  360. claude_mpm/agents/templates/version_control.json +0 -157
  361. claude_mpm/agents/templates/web_qa.json +0 -399
  362. claude_mpm/agents/templates/web_ui.json +0 -189
  363. claude_mpm/cli/commands/mpm_init.py +0 -2093
  364. claude_mpm/commands/mpm-tickets.md +0 -102
  365. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  366. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  367. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  368. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  369. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  370. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  371. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  372. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  373. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  374. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  375. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  376. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  377. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  378. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  379. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  380. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  381. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  382. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  383. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  384. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  385. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  386. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  387. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  388. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  389. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  390. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  391. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  392. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  393. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  394. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  395. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  396. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  397. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  398. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  399. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  400. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  402. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  403. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  404. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  405. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  406. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  407. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  408. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  409. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  410. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  411. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  412. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  413. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  414. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  415. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  416. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  417. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  418. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  419. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  420. claude_mpm/dashboard/static/built/react/events.js +0 -30
  421. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  422. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  423. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  424. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  425. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  426. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  427. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  428. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  429. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  430. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  444. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  445. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  446. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  447. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  448. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  449. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  450. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  451. claude_mpm/dashboard/static/events.html +0 -607
  452. claude_mpm/dashboard/static/index.html +0 -635
  453. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  454. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  455. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  456. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  457. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  458. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  459. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  460. claude_mpm/dashboard/static/legacy/files.html +0 -747
  461. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  462. claude_mpm/dashboard/static/monitors.html +0 -431
  463. claude_mpm/dashboard/static/production/events.html +0 -659
  464. claude_mpm/dashboard/static/production/main.html +0 -698
  465. claude_mpm/dashboard/static/production/monitors.html +0 -483
  466. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  467. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  468. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  469. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  470. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  471. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
  472. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
  473. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
  474. claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
  475. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
  476. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
  477. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  478. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  479. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  480. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  481. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  482. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  483. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  484. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  485. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  486. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  487. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
  488. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  489. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
  490. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
  491. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
  492. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
  493. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  494. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  495. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  496. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  497. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
  498. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  499. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  500. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  501. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  502. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
  503. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
  504. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  505. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  506. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  507. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  508. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  509. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  510. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
  511. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
  512. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  513. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  514. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  515. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  516. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  517. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  518. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  519. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  520. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,504 @@
1
+ """Session Pause Manager Service.
2
+
3
+ WHY: This service creates session pause documents that capture complete conversation
4
+ context, git state, todos, and working directory for seamless resume.
5
+
6
+ DESIGN DECISIONS:
7
+ - Three format output (JSON, YAML, Markdown) for different use cases
8
+ - Atomic file operations using StateStorage
9
+ - Git integration for automatic commits
10
+ - Compatible with SessionResumeHelper for resume workflow
11
+ - LATEST-SESSION.txt pointer for quick access
12
+ """
13
+
14
+ import subprocess
15
+ from datetime import datetime, timezone
16
+ from pathlib import Path
17
+ from typing import Any, Dict, Optional
18
+
19
+ import yaml
20
+
21
+ from claude_mpm.core.logger import get_logger
22
+ from claude_mpm.storage.state_storage import StateStorage
23
+
24
+ logger = get_logger(__name__)
25
+
26
+
27
+ class SessionPauseManager:
28
+ """Manages creating pause sessions and capturing state."""
29
+
30
+ def __init__(self, project_path: Optional[Path] = None):
31
+ """Initialize session pause manager.
32
+
33
+ Args:
34
+ project_path: Project root path (default: current directory)
35
+ """
36
+ self.project_path = (project_path or Path.cwd()).resolve()
37
+ # Use flattened structure: .claude-mpm/sessions/ instead of sessions/pause/
38
+ self.pause_dir = self.project_path / ".claude-mpm" / "sessions"
39
+ self.pause_dir.mkdir(parents=True, exist_ok=True)
40
+ self.storage = StateStorage(self.pause_dir)
41
+
42
+ def create_pause_session(
43
+ self,
44
+ message: Optional[str] = None,
45
+ skip_commit: bool = False,
46
+ export_path: Optional[str] = None,
47
+ ) -> str:
48
+ """Create a pause session with captured state.
49
+
50
+ Args:
51
+ message: Optional pause reason/context message
52
+ skip_commit: Skip git commit of session state
53
+ export_path: Optional export location for session file
54
+
55
+ Returns:
56
+ Session ID
57
+
58
+ Raises:
59
+ Exception: If session creation fails
60
+ """
61
+ logger.info("Creating pause session")
62
+
63
+ # Generate session ID
64
+ session_id = f"session-{datetime.now(timezone.utc).strftime('%Y%m%d-%H%M%S')}"
65
+
66
+ # Capture state
67
+ state = self._capture_state(session_id, message)
68
+
69
+ # Save JSON format
70
+ json_path = self.pause_dir / f"{session_id}.json"
71
+ if not self.storage.write_json(state, json_path, atomic=True):
72
+ raise RuntimeError(f"Failed to write JSON to {json_path}")
73
+ logger.debug(f"Saved JSON: {json_path}")
74
+
75
+ # Save YAML format
76
+ yaml_path = self.pause_dir / f"{session_id}.yaml"
77
+ self._save_yaml(state, yaml_path)
78
+ logger.debug(f"Saved YAML: {yaml_path}")
79
+
80
+ # Save Markdown format
81
+ md_path = self.pause_dir / f"{session_id}.md"
82
+ md_content = self._generate_markdown(state)
83
+ md_path.write_text(md_content)
84
+ logger.debug(f"Saved Markdown: {md_path}")
85
+
86
+ # Update LATEST-SESSION.txt pointer
87
+ self._update_latest_pointer(session_id)
88
+
89
+ # Optional export
90
+ if export_path:
91
+ export_file = Path(export_path).resolve()
92
+ if not self.storage.write_json(state, export_file, atomic=True):
93
+ logger.warning(f"Failed to export to {export_file}")
94
+ else:
95
+ logger.info(f"Exported session to {export_file}")
96
+
97
+ # Optional git commit
98
+ if not skip_commit and self._is_git_repo():
99
+ self._commit_pause_session(session_id, message)
100
+
101
+ logger.info(f"Pause session created: {session_id}")
102
+ return session_id
103
+
104
+ def _capture_state(self, session_id: str, message: Optional[str]) -> Dict[str, Any]:
105
+ """Capture current session state.
106
+
107
+ Args:
108
+ session_id: Session identifier
109
+ message: Optional context message
110
+
111
+ Returns:
112
+ Complete state dictionary
113
+ """
114
+ # Get git context
115
+ git_context = self._get_git_context()
116
+
117
+ # Build state dictionary
118
+ return {
119
+ "session_id": session_id,
120
+ "paused_at": datetime.now(timezone.utc).isoformat(),
121
+ "duration_hours": 0, # Can be calculated if session start time known
122
+ "context_usage": {
123
+ "tokens_used": 0, # Would need Claude API integration
124
+ "tokens_total": 200000,
125
+ "percentage": 0,
126
+ },
127
+ "conversation": {
128
+ "primary_task": "Manual pause - see message below",
129
+ "current_phase": "In progress",
130
+ "summary": message or "No summary provided",
131
+ "accomplishments": [],
132
+ "next_steps": [],
133
+ },
134
+ "git_context": git_context,
135
+ "active_context": {
136
+ "working_directory": str(self.project_path),
137
+ },
138
+ "important_reminders": [],
139
+ "resume_instructions": {
140
+ "quick_start": [
141
+ f"Read {session_id}.md for full context",
142
+ "Run: git status to check current state",
143
+ "Run: cat .claude-mpm/sessions/LATEST-SESSION.txt",
144
+ ],
145
+ "files_to_review": [],
146
+ "validation_commands": {
147
+ "check_git": "git status && git log -1 --stat",
148
+ "check_session": f"cat .claude-mpm/sessions/{session_id}.md",
149
+ },
150
+ },
151
+ "open_questions": [],
152
+ "performance_metrics": {},
153
+ "todos": {"active": [], "completed": []},
154
+ "version": self._get_project_version(),
155
+ "build": "current",
156
+ "project_path": str(self.project_path),
157
+ }
158
+
159
+ def _get_git_context(self) -> Dict[str, Any]:
160
+ """Get git repository context.
161
+
162
+ Returns:
163
+ Git context dictionary
164
+ """
165
+ if not self._is_git_repo():
166
+ return {
167
+ "is_git_repo": False,
168
+ "branch": None,
169
+ "recent_commits": [],
170
+ "status": {
171
+ "clean": True,
172
+ "modified_files": [],
173
+ "untracked_files": [],
174
+ },
175
+ }
176
+
177
+ try:
178
+ # Get current branch
179
+ branch = subprocess.check_output(
180
+ ["git", "branch", "--show-current"],
181
+ cwd=self.project_path,
182
+ text=True,
183
+ stderr=subprocess.DEVNULL,
184
+ ).strip()
185
+
186
+ # Get recent commits (last 5)
187
+ commit_log = subprocess.check_output(
188
+ ["git", "log", "-5", "--pretty=format:%h|%an|%ai|%s"],
189
+ cwd=self.project_path,
190
+ text=True,
191
+ stderr=subprocess.DEVNULL,
192
+ ).strip()
193
+
194
+ recent_commits = []
195
+ for line in commit_log.split("\n"):
196
+ if line:
197
+ parts = line.split("|", 3)
198
+ if len(parts) == 4:
199
+ recent_commits.append(
200
+ {
201
+ "sha": parts[0],
202
+ "author": parts[1],
203
+ "timestamp": parts[2],
204
+ "message": parts[3],
205
+ }
206
+ )
207
+
208
+ # Get status
209
+ status_output = subprocess.check_output(
210
+ ["git", "status", "--porcelain"],
211
+ cwd=self.project_path,
212
+ text=True,
213
+ stderr=subprocess.DEVNULL,
214
+ ).strip()
215
+
216
+ modified_files = []
217
+ untracked_files = []
218
+ if status_output:
219
+ for line in status_output.split("\n"):
220
+ if line.startswith("??"):
221
+ untracked_files.append(line[3:])
222
+ elif line:
223
+ modified_files.append(line[3:])
224
+
225
+ return {
226
+ "is_git_repo": True,
227
+ "branch": branch,
228
+ "recent_commits": recent_commits,
229
+ "status": {
230
+ "clean": len(modified_files) == 0 and len(untracked_files) == 0,
231
+ "modified_files": modified_files,
232
+ "untracked_files": untracked_files,
233
+ },
234
+ }
235
+
236
+ except subprocess.CalledProcessError as e:
237
+ logger.warning(f"Git command failed: {e}")
238
+ return {
239
+ "is_git_repo": True,
240
+ "branch": "unknown",
241
+ "recent_commits": [],
242
+ "status": {"clean": True, "modified_files": [], "untracked_files": []},
243
+ }
244
+
245
+ def _is_git_repo(self) -> bool:
246
+ """Check if directory is a git repository.
247
+
248
+ Returns:
249
+ True if git repository exists
250
+ """
251
+ return (self.project_path / ".git").exists()
252
+
253
+ def _save_yaml(self, state: Dict[str, Any], yaml_path: Path) -> None:
254
+ """Save state as YAML format.
255
+
256
+ Args:
257
+ state: State dictionary
258
+ yaml_path: Target YAML file path
259
+ """
260
+ try:
261
+ with yaml_path.open("w") as f:
262
+ yaml.dump(
263
+ state,
264
+ f,
265
+ default_flow_style=False,
266
+ allow_unicode=True,
267
+ sort_keys=False,
268
+ )
269
+ except Exception as e:
270
+ logger.error(f"Failed to write YAML to {yaml_path}: {e}")
271
+ raise
272
+
273
+ def _generate_markdown(self, state: Dict[str, Any]) -> str:
274
+ """Generate human-readable markdown format.
275
+
276
+ Args:
277
+ state: State dictionary
278
+
279
+ Returns:
280
+ Markdown formatted string
281
+ """
282
+ session_id = state["session_id"]
283
+ paused_at = state["paused_at"]
284
+ conversation = state["conversation"]
285
+ git_context = state["git_context"]
286
+ active_context = state["active_context"]
287
+
288
+ lines = [
289
+ "# Claude MPM Session Pause Document",
290
+ "",
291
+ "## Session Metadata",
292
+ "",
293
+ f"**Session ID**: `{session_id}`",
294
+ f"**Paused At**: {paused_at}",
295
+ f"**Project**: `{state['project_path']}`",
296
+ f"**Version**: {state.get('version', 'unknown')}",
297
+ "",
298
+ "## What You Were Working On",
299
+ "",
300
+ f"**Primary Task**: {conversation['primary_task']}",
301
+ f"**Current Phase**: {conversation['current_phase']}",
302
+ "",
303
+ "**Summary**:",
304
+ f"{conversation['summary']}",
305
+ "",
306
+ ]
307
+
308
+ # Accomplishments
309
+ if conversation.get("accomplishments"):
310
+ lines.append("## Accomplishments This Session")
311
+ lines.append("")
312
+ for item in conversation["accomplishments"]:
313
+ lines.append(f"- {item}")
314
+ lines.append("")
315
+
316
+ # Next steps
317
+ if conversation.get("next_steps"):
318
+ lines.append("## Next Steps (Priority Order)")
319
+ lines.append("")
320
+ for i, step in enumerate(conversation["next_steps"], 1):
321
+ if isinstance(step, dict):
322
+ lines.append(
323
+ f"{i}. **{step.get('task', 'Unknown task')}** (Priority: {step.get('priority', '?')})"
324
+ )
325
+ if step.get("estimated_hours"):
326
+ lines.append(f" - Est. time: {step['estimated_hours']}")
327
+ if step.get("status"):
328
+ lines.append(f" - Status: {step['status']}")
329
+ if step.get("notes"):
330
+ lines.append(f" - Notes: {step['notes']}")
331
+ else:
332
+ lines.append(f"{i}. {step}")
333
+ lines.append("")
334
+
335
+ # Active context
336
+ lines.extend(
337
+ [
338
+ "## Active Context",
339
+ "",
340
+ f"**Working Directory**: `{active_context['working_directory']}`",
341
+ "",
342
+ ]
343
+ )
344
+
345
+ # Git context
346
+ lines.append("## Git Context")
347
+ lines.append("")
348
+ if git_context["is_git_repo"]:
349
+ lines.append(f"**Branch**: `{git_context['branch']}`")
350
+ lines.append(
351
+ f"**Status**: {'Clean' if git_context['status']['clean'] else 'Modified'}"
352
+ )
353
+ lines.append("")
354
+
355
+ if git_context["status"]["modified_files"]:
356
+ lines.append("**Modified files**:")
357
+ for f in git_context["status"]["modified_files"][:10]:
358
+ lines.append(f"- `{f}`")
359
+ lines.append("")
360
+
361
+ if git_context["recent_commits"]:
362
+ lines.append("**Recent commits**:")
363
+ for commit in git_context["recent_commits"]:
364
+ lines.append(
365
+ f"- `{commit['sha']}` - {commit['message']} ({commit['author']})"
366
+ )
367
+ lines.append("")
368
+ else:
369
+ lines.append("*Not a git repository*")
370
+ lines.append("")
371
+
372
+ # Important reminders
373
+ if state.get("important_reminders"):
374
+ lines.append("## Important Reminders")
375
+ lines.append("")
376
+ for reminder in state["important_reminders"]:
377
+ lines.append(f"- {reminder}")
378
+ lines.append("")
379
+
380
+ # Resume instructions
381
+ lines.extend(
382
+ [
383
+ "## Resume Instructions",
384
+ "",
385
+ "### Quick Resume (5 minutes)",
386
+ "",
387
+ ]
388
+ )
389
+ for instruction in state["resume_instructions"]["quick_start"]:
390
+ lines.append(f"1. {instruction}")
391
+ lines.append("")
392
+
393
+ if state["resume_instructions"]["validation_commands"]:
394
+ lines.append("### Validation Commands")
395
+ lines.append("")
396
+ lines.append("```bash")
397
+ for cmd in state["resume_instructions"]["validation_commands"].values():
398
+ lines.append(cmd)
399
+ lines.append("```")
400
+ lines.append("")
401
+
402
+ # Footer
403
+ lines.extend(
404
+ [
405
+ "---",
406
+ "",
407
+ "Resume with: `/mpm-init resume` or `cat .claude-mpm/sessions/LATEST-SESSION.txt`",
408
+ "",
409
+ ]
410
+ )
411
+
412
+ return "\n".join(lines)
413
+
414
+ def _update_latest_pointer(self, session_id: str) -> None:
415
+ """Update LATEST-SESSION.txt pointer.
416
+
417
+ Args:
418
+ session_id: Session identifier
419
+ """
420
+ try:
421
+ latest_file = self.pause_dir / "LATEST-SESSION.txt"
422
+ content = f"""Latest Session: {session_id}
423
+ Paused At: {datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S %Z")}
424
+ Project: {self.project_path}
425
+
426
+ Files:
427
+ - {session_id}.json (machine-readable)
428
+ - {session_id}.yaml (human-readable config)
429
+ - {session_id}.md (documentation)
430
+
431
+ Quick Resume:
432
+ /mpm-init resume
433
+
434
+ Full Context:
435
+ cat .claude-mpm/sessions/{session_id}.md
436
+
437
+ Validation:
438
+ git status && git log -1 --stat
439
+ """
440
+ latest_file.write_text(content)
441
+ logger.debug(f"Updated LATEST-SESSION.txt: {session_id}")
442
+ except Exception as e:
443
+ logger.warning(f"Failed to update LATEST-SESSION.txt: {e}")
444
+
445
+ def _commit_pause_session(self, session_id: str, message: Optional[str]) -> None:
446
+ """Create git commit for pause session.
447
+
448
+ Args:
449
+ session_id: Session identifier
450
+ message: Optional context message
451
+ """
452
+ try:
453
+ # Add session files
454
+ subprocess.run(
455
+ ["git", "add", ".claude-mpm/sessions/"],
456
+ cwd=self.project_path,
457
+ check=True,
458
+ capture_output=True,
459
+ )
460
+
461
+ # Build commit message
462
+ commit_msg = f"session: pause at {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S')}\n\nSession ID: {session_id}"
463
+ if message:
464
+ commit_msg += f"\nContext: {message}"
465
+
466
+ # Create commit
467
+ subprocess.run(
468
+ ["git", "commit", "-m", commit_msg],
469
+ cwd=self.project_path,
470
+ check=True,
471
+ capture_output=True,
472
+ )
473
+
474
+ logger.info(f"Created git commit for pause session: {session_id}")
475
+
476
+ except subprocess.CalledProcessError as e:
477
+ # Non-fatal - pause still succeeded
478
+ logger.warning(f"Failed to create git commit: {e.stderr.decode()}")
479
+
480
+ def _get_project_version(self) -> str:
481
+ """Get project version from pyproject.toml or package.
482
+
483
+ Returns:
484
+ Version string or 'unknown'
485
+ """
486
+ try:
487
+ # Try pyproject.toml
488
+ pyproject = self.project_path / "pyproject.toml"
489
+ if pyproject.exists():
490
+ content = pyproject.read_text()
491
+ for line in content.split("\n"):
492
+ if line.startswith("version"):
493
+ return line.split("=")[1].strip().strip('"')
494
+
495
+ # Try package __version__
496
+ import claude_mpm
497
+
498
+ if hasattr(claude_mpm, "__version__"):
499
+ return claude_mpm.__version__
500
+
501
+ except Exception:
502
+ pass
503
+
504
+ return "unknown"
@@ -5,7 +5,8 @@ It detects paused sessions, calculates git changes since pause, and presents res
5
5
  context to users.
6
6
 
7
7
  DESIGN DECISIONS:
8
- - Project-specific session storage (.claude-mpm/sessions/pause/)
8
+ - Project-specific session storage (.claude-mpm/sessions/)
9
+ - Backward compatibility with legacy .claude-mpm/sessions/pause/ location
9
10
  - Non-blocking detection with graceful degradation
10
11
  - Git change detection for context updates
11
12
  - User-friendly prompts with time elapsed information
@@ -33,7 +34,10 @@ class SessionResumeHelper:
33
34
  project_path: Project root path (default: current directory)
34
35
  """
35
36
  self.project_path = project_path or Path.cwd()
36
- self.pause_dir = self.project_path / ".claude-mpm" / "sessions" / "pause"
37
+ # Primary location: flattened structure
38
+ self.pause_dir = self.project_path / ".claude-mpm" / "sessions"
39
+ # Legacy location for backward compatibility
40
+ self.legacy_pause_dir = self.project_path / ".claude-mpm" / "sessions" / "pause"
37
41
 
38
42
  def has_paused_sessions(self) -> bool:
39
43
  """Check if there are any paused sessions.
@@ -41,11 +45,15 @@ class SessionResumeHelper:
41
45
  Returns:
42
46
  True if paused sessions exist, False otherwise
43
47
  """
44
- if not self.pause_dir.exists():
45
- return False
48
+ # Check both primary and legacy locations
49
+ session_files = []
50
+
51
+ if self.pause_dir.exists():
52
+ session_files.extend(list(self.pause_dir.glob("session-*.json")))
53
+
54
+ if self.legacy_pause_dir.exists():
55
+ session_files.extend(list(self.legacy_pause_dir.glob("session-*.json")))
46
56
 
47
- # Look for session JSON files
48
- session_files = list(self.pause_dir.glob("session-*.json"))
49
57
  return len(session_files) > 0
50
58
 
51
59
  def get_most_recent_session(self) -> Optional[Dict[str, Any]]:
@@ -54,11 +62,15 @@ class SessionResumeHelper:
54
62
  Returns:
55
63
  Session data dictionary or None if no sessions found
56
64
  """
57
- if not self.pause_dir.exists():
58
- return None
65
+ # Find all session files from both locations
66
+ session_files = []
67
+
68
+ if self.pause_dir.exists():
69
+ session_files.extend(list(self.pause_dir.glob("session-*.json")))
70
+
71
+ if self.legacy_pause_dir.exists():
72
+ session_files.extend(list(self.legacy_pause_dir.glob("session-*.json")))
59
73
 
60
- # Find all session files
61
- session_files = list(self.pause_dir.glob("session-*.json"))
62
74
  if not session_files:
63
75
  return None
64
76
 
@@ -316,10 +328,14 @@ class SessionResumeHelper:
316
328
  Returns:
317
329
  Number of paused sessions
318
330
  """
319
- if not self.pause_dir.exists():
320
- return 0
331
+ session_files = []
332
+
333
+ if self.pause_dir.exists():
334
+ session_files.extend(list(self.pause_dir.glob("session-*.json")))
335
+
336
+ if self.legacy_pause_dir.exists():
337
+ session_files.extend(list(self.legacy_pause_dir.glob("session-*.json")))
321
338
 
322
- session_files = list(self.pause_dir.glob("session-*.json"))
323
339
  return len(session_files)
324
340
 
325
341
  def list_all_sessions(self) -> List[Dict[str, Any]]:
@@ -328,10 +344,14 @@ class SessionResumeHelper:
328
344
  Returns:
329
345
  List of session data dictionaries
330
346
  """
331
- if not self.pause_dir.exists():
332
- return []
347
+ session_files = []
348
+
349
+ if self.pause_dir.exists():
350
+ session_files.extend(list(self.pause_dir.glob("session-*.json")))
351
+
352
+ if self.legacy_pause_dir.exists():
353
+ session_files.extend(list(self.legacy_pause_dir.glob("session-*.json")))
333
354
 
334
- session_files = list(self.pause_dir.glob("session-*.json"))
335
355
  if not session_files:
336
356
  return []
337
357
 
@@ -392,7 +392,7 @@ class UnifiedDashboardManager(IUnifiedDashboardManager):
392
392
  port = self.find_available_port()
393
393
 
394
394
  # Use force_restart to ensure we're using the latest code
395
- success, browser_opened = self.start_dashboard(
395
+ success, _browser_opened = self.start_dashboard(
396
396
  port=port, background=True, open_browser=False, force_restart=force_restart
397
397
  )
398
398