claude-mpm 4.21.0__py3-none-any.whl → 5.0.2__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.
Files changed (497) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent.json +6 -3
  9. claude_mpm/agents/frontmatter_validator.py +1 -1
  10. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  11. claude_mpm/agents/templates/context-management-examples.md +544 -0
  12. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  13. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  14. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  15. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  16. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  17. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  18. claude_mpm/cli/__init__.py +38 -2
  19. claude_mpm/cli/commands/agent_source.py +774 -0
  20. claude_mpm/cli/commands/agent_state_manager.py +125 -20
  21. claude_mpm/cli/commands/agents.py +684 -13
  22. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  23. claude_mpm/cli/commands/agents_discover.py +338 -0
  24. claude_mpm/cli/commands/aggregate.py +1 -1
  25. claude_mpm/cli/commands/analyze.py +3 -3
  26. claude_mpm/cli/commands/auto_configure.py +2 -6
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/config.py +7 -4
  29. claude_mpm/cli/commands/configure.py +478 -44
  30. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  31. claude_mpm/cli/commands/configure_navigation.py +63 -46
  32. claude_mpm/cli/commands/debug.py +12 -12
  33. claude_mpm/cli/commands/doctor.py +10 -2
  34. claude_mpm/cli/commands/hook_errors.py +277 -0
  35. claude_mpm/cli/commands/local_deploy.py +1 -4
  36. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  37. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  38. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  39. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  40. claude_mpm/cli/commands/run.py +124 -128
  41. claude_mpm/cli/commands/skill_source.py +694 -0
  42. claude_mpm/cli/commands/skills.py +435 -1
  43. claude_mpm/cli/executor.py +78 -3
  44. claude_mpm/cli/interactive/agent_wizard.py +919 -41
  45. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  46. claude_mpm/cli/parsers/agents_parser.py +173 -4
  47. claude_mpm/cli/parsers/base_parser.py +49 -0
  48. claude_mpm/cli/parsers/config_parser.py +96 -43
  49. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  50. claude_mpm/cli/parsers/skills_parser.py +138 -0
  51. claude_mpm/cli/parsers/source_parser.py +138 -0
  52. claude_mpm/cli/startup.py +499 -84
  53. claude_mpm/cli/startup_display.py +480 -0
  54. claude_mpm/cli/utils.py +1 -1
  55. claude_mpm/cli_module/commands.py +1 -1
  56. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  57. claude_mpm/commands/mpm-agents-detect.md +9 -0
  58. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  59. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  60. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  61. claude_mpm/commands/mpm-doctor.md +9 -0
  62. claude_mpm/commands/mpm-help.md +14 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/mpm-session-resume.md +381 -0
  66. claude_mpm/commands/mpm-status.md +9 -0
  67. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  68. claude_mpm/commands/mpm-ticket-view.md +552 -0
  69. claude_mpm/commands/mpm-version.md +9 -0
  70. claude_mpm/commands/mpm.md +11 -0
  71. claude_mpm/config/agent_presets.py +258 -0
  72. claude_mpm/config/agent_sources.py +325 -0
  73. claude_mpm/config/skill_sources.py +590 -0
  74. claude_mpm/constants.py +12 -0
  75. claude_mpm/core/api_validator.py +1 -1
  76. claude_mpm/core/claude_runner.py +17 -10
  77. claude_mpm/core/config.py +24 -0
  78. claude_mpm/core/constants.py +1 -1
  79. claude_mpm/core/framework/__init__.py +3 -16
  80. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  81. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  82. claude_mpm/core/hook_error_memory.py +381 -0
  83. claude_mpm/core/hook_manager.py +41 -2
  84. claude_mpm/core/interactive_session.py +112 -5
  85. claude_mpm/core/logger.py +3 -1
  86. claude_mpm/core/oneshot_session.py +94 -4
  87. claude_mpm/dashboard/static/css/activity.css +69 -69
  88. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  89. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  90. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  91. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  92. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  93. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  94. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  95. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  96. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  97. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  98. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  99. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  100. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  101. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  102. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  103. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  104. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  105. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  106. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  107. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  108. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  109. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  110. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  111. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  112. claude_mpm/dashboard/templates/code_simple.html +23 -23
  113. claude_mpm/dashboard/templates/index.html +18 -18
  114. claude_mpm/experimental/cli_enhancements.py +1 -5
  115. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  116. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  117. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  118. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  119. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  120. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  121. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  122. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  123. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  124. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  125. claude_mpm/models/git_repository.py +198 -0
  126. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  127. claude_mpm/scripts/start_activity_logging.py +3 -1
  128. claude_mpm/services/agents/agent_builder.py +45 -9
  129. claude_mpm/services/agents/agent_preset_service.py +238 -0
  130. claude_mpm/services/agents/agent_selection_service.py +484 -0
  131. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  132. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  133. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  134. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  135. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  136. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  138. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  139. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  140. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  141. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  142. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  143. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  144. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  145. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  146. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  147. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  148. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  149. claude_mpm/services/agents/git_source_manager.py +629 -0
  150. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  151. claude_mpm/services/agents/local_template_manager.py +50 -10
  152. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  153. claude_mpm/services/agents/sources/__init__.py +13 -0
  154. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  155. claude_mpm/services/agents/sources/git_source_sync_service.py +1055 -0
  156. claude_mpm/services/agents/startup_sync.py +239 -0
  157. claude_mpm/services/agents/toolchain_detector.py +474 -0
  158. claude_mpm/services/cli/session_pause_manager.py +1 -1
  159. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  160. claude_mpm/services/command_deployment_service.py +92 -1
  161. claude_mpm/services/core/base.py +26 -11
  162. claude_mpm/services/core/interfaces/__init__.py +1 -3
  163. claude_mpm/services/core/interfaces/health.py +1 -4
  164. claude_mpm/services/core/models/__init__.py +2 -11
  165. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  166. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  167. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  168. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  169. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  171. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  172. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  173. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  174. claude_mpm/services/event_bus/direct_relay.py +3 -3
  175. claude_mpm/services/event_bus/event_bus.py +36 -3
  176. claude_mpm/services/event_bus/relay.py +23 -7
  177. claude_mpm/services/events/consumers/logging.py +1 -2
  178. claude_mpm/services/git/__init__.py +21 -0
  179. claude_mpm/services/git/git_operations_service.py +494 -0
  180. claude_mpm/services/github/__init__.py +21 -0
  181. claude_mpm/services/github/github_cli_service.py +397 -0
  182. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  183. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  184. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  185. claude_mpm/services/instructions/__init__.py +9 -0
  186. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  187. claude_mpm/services/local_ops/__init__.py +3 -13
  188. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  189. claude_mpm/services/local_ops/health_manager.py +1 -4
  190. claude_mpm/services/local_ops/process_manager.py +1 -1
  191. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  192. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  193. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  194. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  195. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  196. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  197. claude_mpm/services/memory/failure_tracker.py +19 -4
  198. claude_mpm/services/memory/optimizer.py +1 -1
  199. claude_mpm/services/model/model_router.py +8 -9
  200. claude_mpm/services/monitor/daemon.py +1 -1
  201. claude_mpm/services/monitor/server.py +2 -2
  202. claude_mpm/services/native_agent_converter.py +356 -0
  203. claude_mpm/services/port_manager.py +1 -1
  204. claude_mpm/services/pr/__init__.py +14 -0
  205. claude_mpm/services/pr/pr_template_service.py +329 -0
  206. claude_mpm/services/project/documentation_manager.py +2 -1
  207. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  208. claude_mpm/services/runner_configuration_service.py +1 -0
  209. claude_mpm/services/self_upgrade_service.py +165 -7
  210. claude_mpm/services/skills/__init__.py +18 -0
  211. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  212. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  213. claude_mpm/services/skills_config.py +547 -0
  214. claude_mpm/services/skills_deployer.py +955 -0
  215. claude_mpm/services/socketio/handlers/connection.py +1 -1
  216. claude_mpm/services/socketio/handlers/git.py +2 -2
  217. claude_mpm/services/socketio/server/core.py +1 -4
  218. claude_mpm/services/socketio/server/main.py +1 -3
  219. claude_mpm/services/system_instructions_service.py +1 -3
  220. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  221. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  222. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  223. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  224. claude_mpm/services/unified/unified_deployment.py +1 -5
  225. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  226. claude_mpm/services/visualization/__init__.py +1 -5
  227. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  228. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  229. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  230. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  231. claude_mpm/skills/skills_registry.py +0 -1
  232. claude_mpm/templates/questions/__init__.py +38 -0
  233. claude_mpm/templates/questions/base.py +193 -0
  234. claude_mpm/templates/questions/pr_strategy.py +311 -0
  235. claude_mpm/templates/questions/project_init.py +385 -0
  236. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  237. claude_mpm/tools/__main__.py +8 -8
  238. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  239. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  240. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  241. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  242. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  243. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  244. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  245. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  246. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  247. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  248. claude_mpm/utils/agent_dependency_loader.py +80 -13
  249. claude_mpm/utils/dependency_cache.py +3 -1
  250. claude_mpm/utils/gitignore.py +241 -0
  251. claude_mpm/utils/log_cleanup.py +3 -3
  252. claude_mpm/utils/progress.py +383 -0
  253. claude_mpm/utils/robust_installer.py +3 -5
  254. claude_mpm/utils/structured_questions.py +619 -0
  255. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  256. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
  257. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  258. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  259. claude_mpm/agents/templates/agent-manager.json +0 -273
  260. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  261. claude_mpm/agents/templates/api_qa.json +0 -180
  262. claude_mpm/agents/templates/clerk-ops.json +0 -235
  263. claude_mpm/agents/templates/code_analyzer.json +0 -101
  264. claude_mpm/agents/templates/content-agent.json +0 -358
  265. claude_mpm/agents/templates/dart_engineer.json +0 -307
  266. claude_mpm/agents/templates/data_engineer.json +0 -225
  267. claude_mpm/agents/templates/documentation.json +0 -211
  268. claude_mpm/agents/templates/engineer.json +0 -210
  269. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  270. claude_mpm/agents/templates/golang_engineer.json +0 -270
  271. claude_mpm/agents/templates/imagemagick.json +0 -264
  272. claude_mpm/agents/templates/java_engineer.json +0 -346
  273. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  274. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  275. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  276. claude_mpm/agents/templates/memory_manager.json +0 -158
  277. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  278. claude_mpm/agents/templates/ops.json +0 -185
  279. claude_mpm/agents/templates/php-engineer.json +0 -287
  280. claude_mpm/agents/templates/product_owner.json +0 -338
  281. claude_mpm/agents/templates/project_organizer.json +0 -140
  282. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  283. claude_mpm/agents/templates/python_engineer.json +0 -387
  284. claude_mpm/agents/templates/qa.json +0 -242
  285. claude_mpm/agents/templates/react_engineer.json +0 -238
  286. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  287. claude_mpm/agents/templates/research.json +0 -188
  288. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  289. claude_mpm/agents/templates/rust_engineer.json +0 -275
  290. claude_mpm/agents/templates/security.json +0 -202
  291. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  292. claude_mpm/agents/templates/ticketing.json +0 -177
  293. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  294. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  295. claude_mpm/agents/templates/version_control.json +0 -157
  296. claude_mpm/agents/templates/web_qa.json +0 -399
  297. claude_mpm/agents/templates/web_ui.json +0 -189
  298. claude_mpm/commands/mpm-tickets.md +0 -102
  299. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  300. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  301. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  302. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  303. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  304. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  305. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  306. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  307. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  308. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  309. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  310. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  311. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  312. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  313. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  314. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  315. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  316. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  317. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  318. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  319. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  320. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  321. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  322. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  323. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  324. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  325. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  326. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  327. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  328. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  329. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  330. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  332. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  333. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  334. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  335. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  337. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  338. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  339. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  340. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  341. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  343. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  344. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  345. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  346. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  347. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  349. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  351. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  352. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  353. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  354. claude_mpm/dashboard/static/built/react/events.js +0 -30
  355. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  356. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  357. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  358. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  359. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  360. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  361. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  362. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  363. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  364. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  370. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  382. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  383. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  384. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  385. claude_mpm/dashboard/static/events.html +0 -607
  386. claude_mpm/dashboard/static/index.html +0 -635
  387. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  388. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  389. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  390. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  391. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  392. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  393. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  394. claude_mpm/dashboard/static/legacy/files.html +0 -747
  395. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  396. claude_mpm/dashboard/static/monitors.html +0 -431
  397. claude_mpm/dashboard/static/production/events.html +0 -659
  398. claude_mpm/dashboard/static/production/main.html +0 -698
  399. claude_mpm/dashboard/static/production/monitors.html +0 -483
  400. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  401. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  402. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  403. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  404. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  405. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  406. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  407. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  408. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  409. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  410. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  411. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  412. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  413. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  414. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  415. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  416. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  417. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  418. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  419. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  420. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  421. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  422. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  423. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  424. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  425. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  426. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  427. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  432. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  433. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  434. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  435. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  436. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  437. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  438. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  439. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  440. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  441. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  442. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  443. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  444. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  445. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  446. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  447. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  448. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  449. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  450. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  451. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  452. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  453. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  454. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  455. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  456. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  457. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  458. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  459. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  460. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  461. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  462. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  463. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  464. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  465. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  466. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  467. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  468. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  469. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  472. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  473. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  478. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  479. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  480. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  481. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  482. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  483. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  484. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  485. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  486. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  487. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  488. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  489. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  490. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  491. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  492. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  493. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  494. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  495. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  496. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  497. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,374 @@
1
+ """Instruction cache service for managing assembled PM instruction content.
2
+
3
+ WHY: Linux systems have ARG_MAX limits (~128-256KB) that prevent passing
4
+ assembled PM instructions (~450KB) via CLI arguments. This service caches
5
+ the complete assembled instruction content to a file that Claude Code can
6
+ load directly.
7
+
8
+ DESIGN DECISION: Cache FULL assembled instruction content (BASE_PM + PM_INSTRUCTIONS
9
+ + WORKFLOW + capabilities + temporal context) rather than single source file.
10
+ Uses SHA-256 hash-based invalidation to update cache only when assembled content
11
+ changes. This avoids unnecessary file I/O while ensuring cache stays synchronized.
12
+
13
+ Trade-offs:
14
+ - Performance: Hash computation adds ~1ms overhead but saves 450KB arg passing
15
+ - Complexity: Content-based hashing vs. multi-file dependency tracking
16
+ - Reliability: Hash-based validation is deterministic and platform-independent
17
+ - Flexibility: Caller assembles content, service only caches (separation of concerns)
18
+
19
+ Alternatives Considered:
20
+ 1. File-based tracking: Rejected - can't detect changes in dynamic components
21
+ 2. Multi-file dependency tracking: Rejected - complex and error-prone
22
+ 3. No caching (always pass via CLI): Rejected due to Linux ARG_MAX limits
23
+ 4. Database caching: Rejected as overkill for single-content caching
24
+
25
+ Extension Points:
26
+ - Compression: Add gzip compression if content sizes grow beyond disk constraints
27
+ - Multiple cache slots: Support caching different agent instruction sets
28
+ - TTL-based invalidation: Add time-based expiration for dynamic content
29
+ """
30
+
31
+ import hashlib
32
+ import json
33
+ from datetime import datetime, timezone
34
+ from pathlib import Path
35
+ from typing import Any, Dict, Optional
36
+
37
+ from claude_mpm.core.logging_utils import get_logger
38
+
39
+ logger = get_logger(__name__)
40
+
41
+
42
+ class InstructionCacheService:
43
+ """Manages cached assembled PM instruction content for file-based loading.
44
+
45
+ The cache is stored at `.claude-mpm/PM_INSTRUCTIONS.md` and includes
46
+ a metadata file `.claude-mpm/PM_INSTRUCTIONS.md.meta` containing:
47
+ - content_hash: SHA-256 of assembled instruction content
48
+ - content_size_bytes: Size of cached content in bytes
49
+ - content_type: Type identifier ("assembled_instruction")
50
+ - components: List of instruction components that were assembled
51
+ - cached_at: ISO timestamp of cache creation
52
+ - version: Cache format version
53
+
54
+ Cache Updates:
55
+ - Triggered during agent deployment or interactive sessions
56
+ - Accepts pre-assembled instruction content from caller
57
+ - Only updates if content hash changes
58
+ - Atomic writes to prevent partial updates
59
+ - Graceful error handling (deployment continues on cache failure)
60
+
61
+ Performance:
62
+ - Hash computation: O(n) where n = content size, ~1ms for 450KB content
63
+ - Cache validation: O(1) metadata read + O(n) hash computation
64
+ - Update operation: O(n) content write, atomic via temp file
65
+
66
+ Error Handling:
67
+ - All methods return result dicts instead of raising exceptions
68
+ - Errors are logged but don't propagate to callers
69
+ - Graceful degradation: Cache failures don't break deployments
70
+ """
71
+
72
+ CACHE_DIR = ".claude-mpm"
73
+ CACHE_FILENAME = "PM_INSTRUCTIONS.md"
74
+ META_FILENAME = "PM_INSTRUCTIONS.md.meta"
75
+ CACHE_VERSION = "1.0"
76
+
77
+ def __init__(self, project_root: Optional[Path] = None) -> None:
78
+ """Initialize instruction cache service.
79
+
80
+ Args:
81
+ project_root: Project root directory. If None, uses current directory.
82
+ """
83
+ self.project_root = project_root or Path.cwd()
84
+ self.cache_dir = self.project_root / self.CACHE_DIR
85
+ self.cache_file = self.cache_dir / self.CACHE_FILENAME
86
+ self.meta_file = self.cache_dir / self.META_FILENAME
87
+ self.logger = get_logger(__name__)
88
+
89
+ def update_cache(
90
+ self, instruction_content: str, force: bool = False
91
+ ) -> Dict[str, Any]:
92
+ """Update cache with assembled instruction content.
93
+
94
+ This method implements atomic cache updates using a temp file strategy:
95
+ 1. Calculate content hash
96
+ 2. Compare with cached hash (if exists)
97
+ 3. If different or force=True, write content to temp file
98
+ 4. Atomically replace cache with temp file
99
+ 5. Write metadata with new hash
100
+
101
+ Args:
102
+ instruction_content: Complete assembled instruction content
103
+ (BASE_PM + PM_INSTRUCTIONS + WORKFLOW + capabilities + temporal context)
104
+ force: Force update even if hash matches
105
+
106
+ Returns:
107
+ Result dictionary with:
108
+ - updated: Whether cache was updated
109
+ - reason: Why update occurred or was skipped
110
+ - cache_path: Path to cache file
111
+ - content_hash: SHA-256 hash of content
112
+ - content_size_kb: Size of content in KB
113
+
114
+ Error Handling:
115
+ Does NOT raise exceptions - returns error in result dict.
116
+ This ensures cache failures don't break agent deployments.
117
+
118
+ Example:
119
+ >>> service = InstructionCacheService()
120
+ >>> assembled = "# BASE_PM\\n...\\n# PM_INSTRUCTIONS\\n..."
121
+ >>> result = service.update_cache(instruction_content=assembled)
122
+ >>> if result["updated"]:
123
+ ... print(f"Cache updated: {result['reason']}")
124
+ """
125
+ try:
126
+ # Ensure cache directory exists
127
+ self.cache_dir.mkdir(parents=True, exist_ok=True)
128
+
129
+ # Calculate content hash
130
+ content_hash = self._calculate_hash_from_content(instruction_content)
131
+
132
+ # Check if update needed
133
+ if not force and self.is_cache_valid(instruction_content):
134
+ return {
135
+ "updated": False,
136
+ "reason": "cache_valid",
137
+ "cache_path": str(self.cache_file),
138
+ "content_hash": content_hash,
139
+ }
140
+
141
+ # Write content to cache (atomic operation)
142
+ temp_file = self.cache_file.with_suffix(".tmp")
143
+ temp_file.write_text(instruction_content, encoding="utf-8")
144
+ temp_file.replace(self.cache_file)
145
+
146
+ # Write metadata
147
+ self._write_metadata(content_hash, len(instruction_content))
148
+
149
+ self.logger.info(f"Updated instruction cache: {self.cache_file}")
150
+
151
+ return {
152
+ "updated": True,
153
+ "reason": "content_changed" if not force else "forced",
154
+ "cache_path": str(self.cache_file),
155
+ "content_hash": content_hash,
156
+ "content_size_kb": len(instruction_content) / 1024,
157
+ }
158
+
159
+ except Exception as e:
160
+ self.logger.error(f"Failed to update instruction cache: {e}")
161
+ return {
162
+ "updated": False,
163
+ "reason": "error",
164
+ "error": str(e),
165
+ "cache_path": str(self.cache_file),
166
+ }
167
+
168
+ def get_cache_path(self) -> Path:
169
+ """Get path to cache file.
170
+
171
+ Returns:
172
+ Path to PM_INSTRUCTIONS.md cache
173
+
174
+ Example:
175
+ >>> service = InstructionCacheService()
176
+ >>> cache_path = service.get_cache_path()
177
+ >>> print(cache_path) # .claude-mpm/PM_INSTRUCTIONS.md
178
+ """
179
+ return self.cache_file
180
+
181
+ def is_cache_valid(self, instruction_content: str) -> bool:
182
+ """Check if cache matches current assembled content.
183
+
184
+ Validation checks:
185
+ 1. Cache file exists
186
+ 2. Metadata file exists
187
+ 3. Content hash matches cached hash
188
+
189
+ Args:
190
+ instruction_content: Current assembled instruction to validate against
191
+
192
+ Returns:
193
+ True if cache exists and hash matches content
194
+
195
+ Example:
196
+ >>> service = InstructionCacheService()
197
+ >>> assembled = "# BASE_PM\\n...\\n# PM_INSTRUCTIONS\\n..."
198
+ >>> if not service.is_cache_valid(assembled):
199
+ ... service.update_cache(assembled)
200
+ """
201
+ try:
202
+ if not self.cache_file.exists() or not self.meta_file.exists():
203
+ return False
204
+
205
+ content_hash = self._calculate_hash_from_content(instruction_content)
206
+ cached_hash = self._get_cached_hash()
207
+
208
+ return content_hash == cached_hash
209
+
210
+ except Exception as e:
211
+ self.logger.debug(f"Cache validation failed: {e}")
212
+ return False
213
+
214
+ def invalidate_cache(self) -> bool:
215
+ """Invalidate cache by removing cache files.
216
+
217
+ This method removes both the cache file and metadata file,
218
+ forcing a fresh cache creation on next update.
219
+
220
+ Returns:
221
+ True if cache was invalidated (files removed), False otherwise
222
+
223
+ Example:
224
+ >>> service = InstructionCacheService()
225
+ >>> if service.invalidate_cache():
226
+ ... print("Cache cleared")
227
+ """
228
+ try:
229
+ removed = False
230
+ if self.cache_file.exists():
231
+ self.cache_file.unlink()
232
+ removed = True
233
+ if self.meta_file.exists():
234
+ self.meta_file.unlink()
235
+ removed = True
236
+
237
+ if removed:
238
+ self.logger.info("Invalidated instruction cache")
239
+
240
+ return removed
241
+
242
+ except Exception as e:
243
+ self.logger.error(f"Failed to invalidate cache: {e}")
244
+ return False
245
+
246
+ def get_cache_info(self) -> Dict[str, Any]:
247
+ """Get information about current cache state.
248
+
249
+ Returns cache metadata including existence, sizes, and timestamps
250
+ for debugging and monitoring. Note: cannot validate cache without
251
+ current content, so cache_valid is always None.
252
+
253
+ Returns:
254
+ Dictionary with cache metadata:
255
+ - cache_exists: Whether cache file exists
256
+ - cache_path: Path to cache file
257
+ - cache_valid: Always None (validation requires current content)
258
+ - content_type: Type of cached content ("assembled_instruction")
259
+ - cache_size_kb: Cache file size in KB (if exists)
260
+ - cached_at: Cache creation timestamp (if exists)
261
+ - content_hash: Content hash (if cache exists)
262
+ - content_size_bytes: Cached content size in bytes (if exists)
263
+ - components: List of instruction components (if exists)
264
+
265
+ Example:
266
+ >>> service = InstructionCacheService()
267
+ >>> info = service.get_cache_info()
268
+ >>> print(f"Cache exists: {info['cache_exists']}")
269
+ >>> print(f"Size: {info.get('cache_size_kb', 0):.1f}KB")
270
+ """
271
+ info: Dict[str, Any] = {
272
+ "cache_exists": self.cache_file.exists(),
273
+ "cache_path": str(self.cache_file),
274
+ "cache_valid": None, # Can't validate without current content
275
+ "content_type": "assembled_instruction",
276
+ }
277
+
278
+ try:
279
+ if self.cache_file.exists():
280
+ info["cache_size_kb"] = self.cache_file.stat().st_size / 1024
281
+
282
+ # Load metadata
283
+ if self.meta_file.exists():
284
+ meta = json.loads(self.meta_file.read_text())
285
+ info.update(
286
+ {
287
+ "cached_at": meta.get("cached_at"),
288
+ "content_hash": meta.get("content_hash"),
289
+ "content_size_bytes": meta.get("content_size_bytes"),
290
+ "components": meta.get("components", []),
291
+ "cache_version": meta.get("version"),
292
+ }
293
+ )
294
+
295
+ except Exception as e:
296
+ info["error"] = str(e)
297
+
298
+ return info
299
+
300
+ def _calculate_hash_from_content(self, content: str) -> str:
301
+ """Calculate SHA-256 hash of content string.
302
+
303
+ Args:
304
+ content: String content to hash
305
+
306
+ Returns:
307
+ Hex digest of SHA-256 hash
308
+
309
+ Performance:
310
+ - Time complexity: O(n) where n = content size
311
+ - Memory usage: O(1) - hash computed incrementally
312
+ """
313
+ sha256 = hashlib.sha256()
314
+ sha256.update(content.encode("utf-8"))
315
+ return sha256.hexdigest()
316
+
317
+ def _get_cached_hash(self) -> Optional[str]:
318
+ """Get cached content hash from metadata.
319
+
320
+ Returns:
321
+ Cached hash or None if not available
322
+ """
323
+ try:
324
+ if not self.meta_file.exists():
325
+ return None
326
+
327
+ meta = json.loads(self.meta_file.read_text())
328
+ return meta.get("content_hash")
329
+
330
+ except Exception as e:
331
+ self.logger.debug(f"Failed to read cached hash: {e}")
332
+ return None
333
+
334
+ def _write_metadata(self, content_hash: str, content_size: int) -> None:
335
+ """Write cache metadata file.
336
+
337
+ Metadata includes:
338
+ - version: Cache format version (for future compatibility)
339
+ - content_type: Type identifier ("assembled_instruction")
340
+ - content_hash: SHA-256 hash of assembled content
341
+ - content_size_bytes: Size of cached content in bytes
342
+ - components: List of instruction components that were assembled
343
+ - cached_at: ISO 8601 timestamp with UTC timezone
344
+
345
+ Args:
346
+ content_hash: SHA-256 hash of assembled content
347
+ content_size: Size of content in bytes
348
+
349
+ Example metadata:
350
+ {
351
+ "version": "1.0",
352
+ "content_type": "assembled_instruction",
353
+ "content_hash": "abc123...",
354
+ "content_size_bytes": 450000,
355
+ "components": ["BASE_PM.md", "PM_INSTRUCTIONS.md", ...],
356
+ "cached_at": "2025-11-30T15:30:00Z"
357
+ }
358
+ """
359
+ metadata = {
360
+ "version": self.CACHE_VERSION,
361
+ "content_type": "assembled_instruction",
362
+ "components": [
363
+ "BASE_PM.md",
364
+ "PM_INSTRUCTIONS.md",
365
+ "WORKFLOW.md",
366
+ "agent_capabilities",
367
+ "temporal_context",
368
+ ],
369
+ "content_hash": content_hash,
370
+ "content_size_bytes": content_size,
371
+ "cached_at": datetime.now(timezone.utc).isoformat(),
372
+ }
373
+
374
+ self.meta_file.write_text(json.dumps(metadata, indent=2))
@@ -60,10 +60,7 @@ Note: ProcessStatus has been consolidated into ServiceState (core.enums) as of P
60
60
 
61
61
  # Re-export data models and interfaces for convenience
62
62
  from claude_mpm.core.enums import HealthStatus
63
- from claude_mpm.services.core.interfaces.health import (
64
- IHealthCheck,
65
- IHealthCheckManager,
66
- )
63
+ from claude_mpm.services.core.interfaces.health import IHealthCheck, IHealthCheckManager
67
64
  from claude_mpm.services.core.interfaces.process import (
68
65
  IDeploymentStateManager,
69
66
  ILocalProcessManager,
@@ -78,10 +75,7 @@ from claude_mpm.services.core.interfaces.stability import (
78
75
  IMemoryLeakDetector,
79
76
  IResourceMonitor,
80
77
  )
81
- from claude_mpm.services.core.models.health import (
82
- DeploymentHealth,
83
- HealthCheckResult,
84
- )
78
+ from claude_mpm.services.core.models.health import DeploymentHealth, HealthCheckResult
85
79
  from claude_mpm.services.core.models.process import (
86
80
  PROTECTED_PORT_RANGES,
87
81
  DeploymentState,
@@ -106,11 +100,7 @@ from claude_mpm.services.core.models.stability import (
106
100
  from .health_manager import HealthCheckManager
107
101
  from .log_monitor import LogMonitor
108
102
  from .memory_leak_detector import MemoryLeakDetector
109
- from .process_manager import (
110
- LocalProcessManager,
111
- PortConflictError,
112
- ProcessSpawnError,
113
- )
103
+ from .process_manager import LocalProcessManager, PortConflictError, ProcessSpawnError
114
104
  from .resource_monitor import ResourceMonitor
115
105
  from .state_manager import DeploymentStateManager, StateCorruptionError
116
106
  from .unified_manager import UnifiedLocalOpsManager
@@ -14,9 +14,7 @@ ARCHITECTURE:
14
14
  """
15
15
 
16
16
  from claude_mpm.services.local_ops.health_checks.http_check import HttpHealthCheck
17
- from claude_mpm.services.local_ops.health_checks.process_check import (
18
- ProcessHealthCheck,
19
- )
17
+ from claude_mpm.services.local_ops.health_checks.process_check import ProcessHealthCheck
20
18
  from claude_mpm.services.local_ops.health_checks.resource_check import (
21
19
  ResourceHealthCheck,
22
20
  )
@@ -43,10 +43,7 @@ from claude_mpm.core.enums import HealthStatus
43
43
  from claude_mpm.services.core.base import SyncBaseService
44
44
  from claude_mpm.services.core.interfaces.health import IHealthCheckManager
45
45
  from claude_mpm.services.core.interfaces.process import ILocalProcessManager
46
- from claude_mpm.services.core.models.health import (
47
- DeploymentHealth,
48
- HealthCheckResult,
49
- )
46
+ from claude_mpm.services.core.models.health import DeploymentHealth, HealthCheckResult
50
47
  from claude_mpm.services.local_ops.health_checks import (
51
48
  HttpHealthCheck,
52
49
  ProcessHealthCheck,
@@ -187,7 +187,7 @@ class LocalProcessManager(SyncBaseService, ILocalProcessManager):
187
187
  # Check if process is still running
188
188
  if process.poll() is not None:
189
189
  # Process died immediately
190
- stdout, stderr = process.communicate()
190
+ _stdout, stderr = process.communicate()
191
191
  error_msg = stderr.decode("utf-8", errors="replace") if stderr else ""
192
192
  raise ProcessSpawnError(
193
193
  f"Process died immediately. Exit code: {process.returncode}. "
@@ -102,7 +102,7 @@ class ResourceMonitor(SyncBaseService, IResourceMonitor):
102
102
  self._initialized = True
103
103
  self.log_info(
104
104
  f"Resource monitor initialized "
105
- f"(fd_threshold={self.fd_threshold_percent*100:.0f}%, "
105
+ f"(fd_threshold={self.fd_threshold_percent * 100:.0f}%, "
106
106
  f"thread_threshold={self.thread_threshold}, "
107
107
  f"connection_threshold={self.connection_threshold}, "
108
108
  f"disk_threshold={self.disk_threshold_mb}MB)"
@@ -304,7 +304,7 @@ class ResourceMonitor(SyncBaseService, IResourceMonitor):
304
304
  return 0
305
305
 
306
306
  try:
307
- soft_limit, hard_limit = resource_module.getrlimit(
307
+ soft_limit, _hard_limit = resource_module.getrlimit(
308
308
  resource_module.RLIMIT_NOFILE
309
309
  )
310
310
  return soft_limit
@@ -215,7 +215,7 @@ class MCPConfiguration(BaseMCPService, IMCPConfiguration):
215
215
  current[part] = {}
216
216
  elif not isinstance(current[part], dict):
217
217
  self.log_warning(
218
- f"Cannot override non-dict config at {'.'.join(config_path[:i+1])}"
218
+ f"Cannot override non-dict config at {'.'.join(config_path[: i + 1])}"
219
219
  )
220
220
  break
221
221
  current = current[part]
@@ -21,12 +21,7 @@ from typing import Any, Callable, Dict, List, Optional, Union
21
21
 
22
22
  # Import from the official MCP package
23
23
  from mcp.server import Server
24
- from mcp.types import (
25
- EmbeddedResource,
26
- ImageContent,
27
- TextContent,
28
- Tool,
29
- )
24
+ from mcp.types import EmbeddedResource, ImageContent, TextContent, Tool
30
25
 
31
26
  from claude_mpm.services.mcp_gateway.core.base import BaseMCPService
32
27
  from claude_mpm.services.mcp_gateway.core.interfaces import (
@@ -65,7 +65,6 @@ def apply_backward_compatibility_patches():
65
65
  and hasattr(request, "params")
66
66
  and request.params is not None
67
67
  ):
68
-
69
68
  # Convert params to dict to check for clientInfo
70
69
  params_dict = request.params
71
70
  if hasattr(params_dict, "model_dump"):
@@ -542,7 +541,6 @@ class SimpleMCPServer:
542
541
 
543
542
  result = f"Python: {sys.version}"
544
543
  elif info_type == "cwd":
545
-
546
544
  result = f"Working Directory: {Path.cwd()}"
547
545
  elif info_type == "all":
548
546
  import datetime
@@ -73,7 +73,7 @@ class LRUCache:
73
73
  if not self.cache:
74
74
  break
75
75
  # Remove least recently used item
76
- removed_key, removed_value = self.cache.popitem(last=False)
76
+ _removed_key, removed_value = self.cache.popitem(last=False)
77
77
  self.current_memory -= removed_value.get("size_bytes", 0)
78
78
 
79
79
  # Add new item
@@ -199,7 +199,9 @@ class KuzuMemoryService(BaseToolAdapter):
199
199
  try:
200
200
  if action == "store":
201
201
  result = await self.store_memory(
202
- params.get("content"), params.get("tags"), {} # metadata
202
+ params.get("content"),
203
+ params.get("tags"),
204
+ {}, # metadata
203
205
  )
204
206
  elif action == "recall":
205
207
  result = await self.recall_memories(
@@ -213,7 +215,9 @@ class KuzuMemoryService(BaseToolAdapter):
213
215
  )
214
216
  elif action == "context":
215
217
  result = await self.get_context(
216
- params.get("query", ""), 2, True # depth # include_related
218
+ params.get("query", ""),
219
+ 2,
220
+ True, # depth # include_related
217
221
  )
218
222
  else:
219
223
  return MCPToolResult(success=False, error=f"Unknown action: {action}")
@@ -29,6 +29,7 @@ Example flow:
29
29
 
30
30
  import logging
31
31
  import re
32
+ import threading
32
33
  from dataclasses import dataclass, field
33
34
  from datetime import datetime, timezone
34
35
  from typing import Dict, List, Optional, Tuple
@@ -536,6 +537,7 @@ class FailureTracker:
536
537
 
537
538
  # Singleton instance for session-level tracking
538
539
  _tracker_instance: Optional[FailureTracker] = None
540
+ _tracker_lock = threading.Lock()
539
541
 
540
542
 
541
543
  def get_failure_tracker() -> FailureTracker:
@@ -544,13 +546,23 @@ def get_failure_tracker() -> FailureTracker:
544
546
  WHY: Session-level tracking requires a singleton to maintain state
545
547
  across multiple hook invocations during the same session.
546
548
 
549
+ Thread-safe implementation using double-checked locking pattern to
550
+ prevent race conditions during concurrent initialization.
551
+
547
552
  Returns:
548
553
  The FailureTracker singleton instance
549
554
  """
550
555
  global _tracker_instance
551
- if _tracker_instance is None:
552
- _tracker_instance = FailureTracker()
553
- return _tracker_instance
556
+
557
+ # Fast path - check without lock
558
+ if _tracker_instance is not None:
559
+ return _tracker_instance
560
+
561
+ # Slow path - acquire lock and double-check
562
+ with _tracker_lock:
563
+ if _tracker_instance is None:
564
+ _tracker_instance = FailureTracker()
565
+ return _tracker_instance
554
566
 
555
567
 
556
568
  def reset_failure_tracker() -> None:
@@ -558,6 +570,9 @@ def reset_failure_tracker() -> None:
558
570
 
559
571
  WHY: Tests need to reset state between runs. Also useful for
560
572
  explicitly starting a new tracking session.
573
+
574
+ Thread-safe implementation ensures proper cleanup.
561
575
  """
562
576
  global _tracker_instance
563
- _tracker_instance = None
577
+ with _tracker_lock:
578
+ _tracker_instance = None
@@ -618,7 +618,7 @@ class MemoryOptimizer(LoggerMixin):
618
618
  )
619
619
 
620
620
  # Check for similar items
621
- consolidated, consolidated_count = self._consolidate_similar_items(
621
+ _consolidated, consolidated_count = self._consolidate_similar_items(
622
622
  unique_points
623
623
  )
624
624
  if consolidated_count > 0:
@@ -266,7 +266,7 @@ class ModelRouter(BaseService, IModelRouter):
266
266
 
267
267
  # Route based on strategy
268
268
  if self.strategy == RoutingStrategy.CLAUDE_ONLY:
269
- return await self._route_to_claude(content, task, model, **kwargs)
269
+ return await self._route_to_claude(content, task, model=model, **kwargs)
270
270
 
271
271
  if self.strategy in (
272
272
  RoutingStrategy.OLLAMA_ONLY,
@@ -275,13 +275,13 @@ class ModelRouter(BaseService, IModelRouter):
275
275
  return await self._route_to_ollama(
276
276
  content,
277
277
  task,
278
- model,
278
+ model=model,
279
279
  require_success=True,
280
280
  **kwargs,
281
281
  )
282
282
 
283
283
  # AUTO strategy
284
- return await self._route_auto(content, task, model, **kwargs)
284
+ return await self._route_auto(content, task, model=model, **kwargs)
285
285
 
286
286
  async def _route_auto(
287
287
  self,
@@ -308,7 +308,7 @@ class ModelRouter(BaseService, IModelRouter):
308
308
  response = await self._route_to_ollama(
309
309
  content,
310
310
  task,
311
- model,
311
+ model=model,
312
312
  require_success=False,
313
313
  **kwargs,
314
314
  )
@@ -325,7 +325,7 @@ class ModelRouter(BaseService, IModelRouter):
325
325
  # Ollama unavailable or failed - fallback to Claude
326
326
  if self.fallback_enabled:
327
327
  self.log_info("Falling back to Claude")
328
- return await self._route_to_claude(content, task, model, **kwargs)
328
+ return await self._route_to_claude(content, task, model=model, **kwargs)
329
329
  return self._create_error_response(
330
330
  task,
331
331
  model,
@@ -356,8 +356,7 @@ class ModelRouter(BaseService, IModelRouter):
356
356
  if require_success and not await self.ollama_provider.is_available():
357
357
  if self.strategy == RoutingStrategy.PRIVACY_FIRST:
358
358
  error_msg = (
359
- "Ollama not available. Privacy mode enabled - "
360
- "not sending to cloud."
359
+ "Ollama not available. Privacy mode enabled - not sending to cloud."
361
360
  )
362
361
  else:
363
362
  error_msg = "Ollama not available and required by configuration"
@@ -368,7 +367,7 @@ class ModelRouter(BaseService, IModelRouter):
368
367
  self._route_count["ollama"] += 1
369
368
 
370
369
  return await self.ollama_provider.analyze_content(
371
- content, task, model, **kwargs
370
+ content, task, model=model, **kwargs
372
371
  )
373
372
 
374
373
  async def _route_to_claude(
@@ -394,7 +393,7 @@ class ModelRouter(BaseService, IModelRouter):
394
393
  self._route_count["claude"] += 1
395
394
 
396
395
  return await self.claude_provider.analyze_content(
397
- content, task, model, **kwargs
396
+ content, task, model=model, **kwargs
398
397
  )
399
398
 
400
399
  def _create_error_response(