claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__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 (623) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
  5. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  6. claude_mpm/agents/MEMORY.md +1 -1
  7. claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
  8. claude_mpm/agents/WORKFLOW.md +5 -254
  9. claude_mpm/agents/__init__.py +6 -0
  10. claude_mpm/agents/agent_loader.py +14 -48
  11. claude_mpm/agents/base_agent.json +7 -4
  12. claude_mpm/agents/frontmatter_validator.py +71 -3
  13. claude_mpm/agents/templates/circuit-breakers.md +1391 -0
  14. claude_mpm/agents/templates/context-management-examples.md +544 -0
  15. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  16. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  17. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  18. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  19. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  20. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  21. claude_mpm/cli/__init__.py +37 -2
  22. claude_mpm/cli/__main__.py +4 -0
  23. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  24. claude_mpm/cli/commands/__init__.py +2 -0
  25. claude_mpm/cli/commands/agent_source.py +774 -0
  26. claude_mpm/cli/commands/agent_state_manager.py +180 -31
  27. claude_mpm/cli/commands/agents.py +1116 -55
  28. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  29. claude_mpm/cli/commands/agents_discover.py +338 -0
  30. claude_mpm/cli/commands/aggregate.py +1 -1
  31. claude_mpm/cli/commands/analyze.py +3 -3
  32. claude_mpm/cli/commands/auto_configure.py +725 -242
  33. claude_mpm/cli/commands/config.py +95 -6
  34. claude_mpm/cli/commands/configure.py +1875 -46
  35. claude_mpm/cli/commands/configure_agent_display.py +29 -10
  36. claude_mpm/cli/commands/configure_navigation.py +63 -46
  37. claude_mpm/cli/commands/debug.py +12 -12
  38. claude_mpm/cli/commands/doctor.py +10 -2
  39. claude_mpm/cli/commands/hook_errors.py +277 -0
  40. claude_mpm/cli/commands/local_deploy.py +1 -4
  41. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  42. claude_mpm/cli/commands/mpm_init/core.py +229 -2
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  44. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
  46. claude_mpm/cli/commands/postmortem.py +401 -0
  47. claude_mpm/cli/commands/profile.py +277 -0
  48. claude_mpm/cli/commands/run.py +123 -165
  49. claude_mpm/cli/commands/skill_source.py +694 -0
  50. claude_mpm/cli/commands/skills.py +782 -20
  51. claude_mpm/cli/commands/summarize.py +413 -0
  52. claude_mpm/cli/executor.py +96 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1030 -45
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +307 -10
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  57. claude_mpm/cli/parsers/base_parser.py +65 -0
  58. claude_mpm/cli/parsers/config_parser.py +162 -39
  59. claude_mpm/cli/parsers/profile_parser.py +148 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +146 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +1280 -118
  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-config.md +21 -134
  68. claude_mpm/commands/mpm-doctor.md +16 -20
  69. claude_mpm/commands/mpm-help.md +13 -283
  70. claude_mpm/commands/mpm-init.md +88 -489
  71. claude_mpm/commands/mpm-monitor.md +23 -401
  72. claude_mpm/commands/mpm-organize.md +72 -247
  73. claude_mpm/commands/mpm-postmortem.md +21 -0
  74. claude_mpm/commands/mpm-session-resume.md +30 -0
  75. claude_mpm/commands/mpm-status.md +13 -68
  76. claude_mpm/commands/mpm-ticket-view.md +109 -0
  77. claude_mpm/commands/mpm-version.md +13 -106
  78. claude_mpm/commands/mpm.md +10 -0
  79. claude_mpm/config/agent_presets.py +488 -0
  80. claude_mpm/config/agent_sources.py +352 -0
  81. claude_mpm/config/skill_presets.py +392 -0
  82. claude_mpm/config/skill_sources.py +590 -0
  83. claude_mpm/constants.py +13 -0
  84. claude_mpm/core/claude_runner.py +5 -34
  85. claude_mpm/core/config.py +15 -1
  86. claude_mpm/core/constants.py +1 -1
  87. claude_mpm/core/framework/__init__.py +3 -16
  88. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  89. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  90. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  91. claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
  92. claude_mpm/core/framework_loader.py +4 -2
  93. claude_mpm/core/hook_error_memory.py +381 -0
  94. claude_mpm/core/hook_manager.py +41 -2
  95. claude_mpm/core/interactive_session.py +91 -10
  96. claude_mpm/core/logger.py +16 -1
  97. claude_mpm/core/oneshot_session.py +71 -8
  98. claude_mpm/core/optimized_startup.py +59 -0
  99. claude_mpm/core/output_style_manager.py +173 -43
  100. claude_mpm/core/protocols/__init__.py +23 -0
  101. claude_mpm/core/protocols/runner_protocol.py +103 -0
  102. claude_mpm/core/protocols/session_protocol.py +131 -0
  103. claude_mpm/core/shared/config_loader.py +1 -1
  104. claude_mpm/core/shared/singleton_manager.py +11 -4
  105. claude_mpm/core/socketio_pool.py +3 -3
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_agent_registry.py +134 -16
  108. claude_mpm/core/unified_config.py +22 -0
  109. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  110. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  111. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  112. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  113. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  114. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  115. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  116. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  117. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  118. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  119. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  120. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  121. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  122. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  123. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  124. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  125. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  126. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  127. claude_mpm/experimental/cli_enhancements.py +1 -5
  128. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  131. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  136. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  137. claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
  138. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  139. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  140. claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
  141. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  142. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  143. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  144. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  145. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  149. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  150. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  151. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  152. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  153. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  154. claude_mpm/hooks/memory_integration_hook.py +46 -1
  155. claude_mpm/init.py +63 -19
  156. claude_mpm/models/agent_definition.py +7 -0
  157. claude_mpm/models/git_repository.py +198 -0
  158. claude_mpm/scripts/claude-hook-handler.sh +60 -20
  159. claude_mpm/scripts/launch_monitor.py +93 -13
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +48 -12
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  164. claude_mpm/services/agents/agent_review_service.py +280 -0
  165. claude_mpm/services/agents/agent_selection_service.py +484 -0
  166. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  167. claude_mpm/services/agents/cache_git_manager.py +621 -0
  168. claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
  169. claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
  170. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  171. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  172. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  174. claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
  175. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  176. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  177. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  178. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
  179. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  180. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  181. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
  182. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  183. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  184. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  185. claude_mpm/services/agents/git_source_manager.py +663 -0
  186. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  187. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  188. claude_mpm/services/agents/local_template_manager.py +50 -10
  189. claude_mpm/services/agents/recommender.py +5 -3
  190. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  191. claude_mpm/services/agents/sources/__init__.py +13 -0
  192. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  193. claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
  194. claude_mpm/services/agents/startup_sync.py +259 -0
  195. claude_mpm/services/agents/toolchain_detector.py +478 -0
  196. claude_mpm/services/analysis/__init__.py +35 -0
  197. claude_mpm/services/analysis/clone_detector.py +1030 -0
  198. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  199. claude_mpm/services/analysis/postmortem_service.py +765 -0
  200. claude_mpm/services/cli/session_pause_manager.py +1 -1
  201. claude_mpm/services/command_deployment_service.py +271 -6
  202. claude_mpm/services/core/base.py +7 -2
  203. claude_mpm/services/core/interfaces/__init__.py +1 -3
  204. claude_mpm/services/core/interfaces/health.py +1 -4
  205. claude_mpm/services/core/models/__init__.py +2 -11
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
  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/event_bus/config.py +3 -1
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/events/consumers/logging.py +1 -2
  219. claude_mpm/services/git/__init__.py +21 -0
  220. claude_mpm/services/git/git_operations_service.py +579 -0
  221. claude_mpm/services/github/__init__.py +21 -0
  222. claude_mpm/services/github/github_cli_service.py +397 -0
  223. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  224. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  225. claude_mpm/services/instructions/__init__.py +9 -0
  226. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  227. claude_mpm/services/local_ops/__init__.py +3 -13
  228. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  229. claude_mpm/services/local_ops/health_manager.py +1 -4
  230. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  231. claude_mpm/services/mcp_config_manager.py +75 -145
  232. claude_mpm/services/mcp_service_verifier.py +6 -3
  233. claude_mpm/services/model/model_router.py +1 -2
  234. claude_mpm/services/monitor/daemon.py +38 -11
  235. claude_mpm/services/monitor/daemon_manager.py +134 -21
  236. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  237. claude_mpm/services/monitor/server.py +700 -24
  238. claude_mpm/services/pm_skills_deployer.py +676 -0
  239. claude_mpm/services/port_manager.py +1 -1
  240. claude_mpm/services/pr/__init__.py +14 -0
  241. claude_mpm/services/pr/pr_template_service.py +329 -0
  242. claude_mpm/services/profile_manager.py +331 -0
  243. claude_mpm/services/project/documentation_manager.py +2 -1
  244. claude_mpm/services/project/project_organizer.py +4 -0
  245. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  246. claude_mpm/services/runner_configuration_service.py +16 -3
  247. claude_mpm/services/self_upgrade_service.py +120 -12
  248. claude_mpm/services/session_management_service.py +16 -4
  249. claude_mpm/services/skills/__init__.py +21 -0
  250. claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
  251. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  252. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  253. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  254. claude_mpm/services/skills_config.py +547 -0
  255. claude_mpm/services/skills_deployer.py +1072 -0
  256. claude_mpm/services/socketio/dashboard_server.py +1 -0
  257. claude_mpm/services/socketio/event_normalizer.py +51 -6
  258. claude_mpm/services/socketio/handlers/connection.py +1 -1
  259. claude_mpm/services/socketio/handlers/git.py +1 -1
  260. claude_mpm/services/socketio/server/core.py +387 -112
  261. claude_mpm/services/socketio/server/main.py +1 -3
  262. claude_mpm/services/system_instructions_service.py +1 -3
  263. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  264. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  265. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  266. claude_mpm/services/unified/unified_deployment.py +1 -5
  267. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  268. claude_mpm/services/version_control/git_operations.py +103 -0
  269. claude_mpm/services/visualization/__init__.py +1 -5
  270. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  271. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  272. claude_mpm/skills/skill_manager.py +92 -3
  273. claude_mpm/skills/skills_registry.py +0 -1
  274. claude_mpm/templates/questions/__init__.py +38 -0
  275. claude_mpm/templates/questions/base.py +193 -0
  276. claude_mpm/templates/questions/pr_strategy.py +311 -0
  277. claude_mpm/templates/questions/project_init.py +385 -0
  278. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  279. claude_mpm/tools/__main__.py +8 -8
  280. claude_mpm/utils/agent_dependency_loader.py +91 -12
  281. claude_mpm/utils/agent_filters.py +261 -0
  282. claude_mpm/utils/dependency_cache.py +3 -1
  283. claude_mpm/utils/gitignore.py +244 -0
  284. claude_mpm/utils/migration.py +372 -0
  285. claude_mpm/utils/progress.py +387 -0
  286. claude_mpm/utils/robust_installer.py +49 -7
  287. claude_mpm/utils/structured_questions.py +619 -0
  288. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
  289. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
  290. claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
  291. claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
  292. claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
  293. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  294. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  295. claude_mpm/agents/BASE_OPS.md +0 -219
  296. claude_mpm/agents/BASE_PM.md +0 -468
  297. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  298. claude_mpm/agents/BASE_QA.md +0 -167
  299. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  300. claude_mpm/agents/base_agent_loader.py +0 -626
  301. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  302. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  303. claude_mpm/agents/templates/agent-manager.json +0 -273
  304. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  305. claude_mpm/agents/templates/api_qa.json +0 -183
  306. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  307. claude_mpm/agents/templates/clerk-ops.json +0 -235
  308. claude_mpm/agents/templates/code_analyzer.json +0 -101
  309. claude_mpm/agents/templates/content-agent.json +0 -358
  310. claude_mpm/agents/templates/dart_engineer.json +0 -307
  311. claude_mpm/agents/templates/data_engineer.json +0 -225
  312. claude_mpm/agents/templates/documentation.json +0 -238
  313. claude_mpm/agents/templates/engineer.json +0 -210
  314. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  315. claude_mpm/agents/templates/golang_engineer.json +0 -270
  316. claude_mpm/agents/templates/imagemagick.json +0 -264
  317. claude_mpm/agents/templates/java_engineer.json +0 -346
  318. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  319. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  320. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  321. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  322. claude_mpm/agents/templates/memory_manager.json +0 -158
  323. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  324. claude_mpm/agents/templates/ops.json +0 -185
  325. claude_mpm/agents/templates/php-engineer.json +0 -287
  326. claude_mpm/agents/templates/product_owner.json +0 -338
  327. claude_mpm/agents/templates/project_organizer.json +0 -144
  328. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  329. claude_mpm/agents/templates/python_engineer.json +0 -387
  330. claude_mpm/agents/templates/qa.json +0 -243
  331. claude_mpm/agents/templates/react_engineer.json +0 -239
  332. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  333. claude_mpm/agents/templates/research.json +0 -188
  334. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  335. claude_mpm/agents/templates/rust_engineer.json +0 -275
  336. claude_mpm/agents/templates/security.json +0 -202
  337. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  338. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  339. claude_mpm/agents/templates/ticketing.json +0 -178
  340. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  341. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  342. claude_mpm/agents/templates/version_control.json +0 -159
  343. claude_mpm/agents/templates/web_qa.json +0 -400
  344. claude_mpm/agents/templates/web_ui.json +0 -189
  345. claude_mpm/cli/commands/agents_detect.py +0 -380
  346. claude_mpm/cli/commands/agents_recommend.py +0 -309
  347. claude_mpm/cli/ticket_cli.py +0 -35
  348. claude_mpm/commands/mpm-agents-detect.md +0 -168
  349. claude_mpm/commands/mpm-agents-recommend.md +0 -214
  350. claude_mpm/commands/mpm-agents.md +0 -122
  351. claude_mpm/commands/mpm-auto-configure.md +0 -269
  352. claude_mpm/commands/mpm-resume.md +0 -372
  353. claude_mpm/commands/mpm-tickets.md +0 -151
  354. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  355. claude_mpm/dashboard/analysis_runner.py +0 -455
  356. claude_mpm/dashboard/index.html +0 -13
  357. claude_mpm/dashboard/open_dashboard.py +0 -66
  358. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  359. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  360. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  361. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  362. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  363. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  364. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  365. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  366. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  367. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  368. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  369. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  370. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  371. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  372. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  373. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  374. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  375. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  376. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  377. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  378. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  379. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  380. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  381. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  382. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  383. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  384. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  385. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  386. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  387. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  388. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  389. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  390. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  391. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  392. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  393. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  394. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  395. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  396. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  397. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  398. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  399. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  400. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  402. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  403. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  404. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  405. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  406. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  407. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  408. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  409. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  410. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  411. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  412. claude_mpm/dashboard/static/built/react/events.js +0 -30
  413. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  414. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  415. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  416. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  417. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  418. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  419. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  420. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  421. claude_mpm/dashboard/static/css/activity.css +0 -1958
  422. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  423. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  424. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  425. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  426. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  443. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  444. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  445. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  446. claude_mpm/dashboard/static/events.html +0 -607
  447. claude_mpm/dashboard/static/index.html +0 -635
  448. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  449. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  450. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  451. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  452. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  453. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  454. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  455. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  456. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  457. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  458. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  459. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  460. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  461. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  462. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  463. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  464. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  465. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  466. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  467. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  468. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  469. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  470. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  471. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  472. claude_mpm/dashboard/static/js/dashboard.js +0 -1896
  473. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  474. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  475. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  476. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  477. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  478. claude_mpm/dashboard/static/js/socket-client.js +0 -1457
  479. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  480. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  481. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  482. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  483. claude_mpm/dashboard/static/legacy/files.html +0 -747
  484. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  485. claude_mpm/dashboard/static/monitors.html +0 -431
  486. claude_mpm/dashboard/static/production/events.html +0 -659
  487. claude_mpm/dashboard/static/production/main.html +0 -698
  488. claude_mpm/dashboard/static/production/monitors.html +0 -483
  489. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  490. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  491. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  492. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  493. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  494. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  495. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  496. claude_mpm/dashboard/templates/code_simple.html +0 -153
  497. claude_mpm/dashboard/templates/index.html +0 -606
  498. claude_mpm/dashboard/test_dashboard.html +0 -372
  499. claude_mpm/scripts/mcp_server.py +0 -75
  500. claude_mpm/scripts/mcp_wrapper.py +0 -39
  501. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  502. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  503. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  504. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  505. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  506. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  507. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  508. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  509. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  510. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  511. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
  512. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  513. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  514. claude_mpm/services/mcp_gateway/main.py +0 -589
  515. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  516. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  517. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  518. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  519. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
  520. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  521. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
  522. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  523. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  524. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  525. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  526. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  527. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  528. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
  529. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  530. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  531. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  532. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  533. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  534. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  535. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  536. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  537. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  538. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  539. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  540. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  541. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  542. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  543. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  544. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  545. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  546. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  547. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  548. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  549. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  550. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  551. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  552. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  553. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  554. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  555. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  556. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  557. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  558. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  559. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  560. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  561. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  562. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  563. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  564. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  565. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  566. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  567. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  568. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  569. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  570. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  571. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  572. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  573. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  574. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  575. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  576. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  577. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  578. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  579. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  580. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  581. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  582. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  583. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  584. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  585. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  586. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  587. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  588. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  589. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  590. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  591. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  592. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  593. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  594. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  595. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  596. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  597. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  598. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  599. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  600. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  601. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  602. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  603. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  604. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  605. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  606. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  607. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  608. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  609. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  610. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  611. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  612. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  613. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  614. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  615. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  616. claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
  617. claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
  618. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  619. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  620. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  621. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  622. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
  623. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
@@ -1,789 +0,0 @@
1
- """
2
- Document Summarizer Tool
3
- ========================
4
-
5
- Intelligent document processing tool for solving Claude Code memory issues.
6
- Supports multiple file formats and summarization strategies.
7
-
8
- Part of ISS-0037: Document Summarizer Tool - Intelligent Document Processing
9
- """
10
-
11
- import hashlib
12
- import mimetypes
13
- import re
14
- from collections import OrderedDict
15
- from datetime import datetime, timezone
16
- from pathlib import Path
17
- from typing import Any, Dict, List, Optional, Tuple
18
-
19
- from claude_mpm.services.mcp_gateway.core.interfaces import (
20
- MCPToolDefinition,
21
- MCPToolInvocation,
22
- MCPToolResult,
23
- )
24
- from claude_mpm.services.mcp_gateway.tools.base_adapter import BaseToolAdapter
25
-
26
-
27
- class LRUCache:
28
- """
29
- Simple LRU cache implementation for document summaries.
30
-
31
- WHY: We need a memory-efficient cache to avoid re-processing documents
32
- that are accessed repeatedly, which is common in Claude Code sessions.
33
- """
34
-
35
- def __init__(self, max_size: int = 100, max_memory_mb: int = 100):
36
- """
37
- Initialize LRU cache.
38
-
39
- Args:
40
- max_size: Maximum number of entries
41
- max_memory_mb: Maximum memory usage in MB
42
- """
43
- self.cache = OrderedDict()
44
- self.max_size = max_size
45
- self.max_memory_bytes = max_memory_mb * 1024 * 1024
46
- self.current_memory = 0
47
- self.hits = 0
48
- self.misses = 0
49
-
50
- def get(self, key: str) -> Optional[Dict[str, Any]]:
51
- """Get item from cache, updating LRU order."""
52
- if key in self.cache:
53
- self.hits += 1
54
- # Move to end (most recently used)
55
- self.cache.move_to_end(key)
56
- return self.cache[key]
57
- self.misses += 1
58
- return None
59
-
60
- def put(self, key: str, value: Dict[str, Any], size_bytes: int) -> None:
61
- """Add item to cache, evicting LRU items if necessary."""
62
- # Remove item if it already exists
63
- if key in self.cache:
64
- old_size = self.cache[key].get("size_bytes", 0)
65
- self.current_memory -= old_size
66
- del self.cache[key]
67
-
68
- # Evict items if necessary
69
- while (
70
- len(self.cache) >= self.max_size
71
- or self.current_memory + size_bytes > self.max_memory_bytes
72
- ):
73
- if not self.cache:
74
- break
75
- # Remove least recently used item
76
- _removed_key, removed_value = self.cache.popitem(last=False)
77
- self.current_memory -= removed_value.get("size_bytes", 0)
78
-
79
- # Add new item
80
- value["size_bytes"] = size_bytes
81
- self.cache[key] = value
82
- self.current_memory += size_bytes
83
-
84
- def get_stats(self) -> Dict[str, Any]:
85
- """Get cache statistics."""
86
- hit_rate = (
87
- self.hits / (self.hits + self.misses)
88
- if (self.hits + self.misses) > 0
89
- else 0
90
- )
91
- return {
92
- "size": len(self.cache),
93
- "memory_mb": self.current_memory / (1024 * 1024),
94
- "hits": self.hits,
95
- "misses": self.misses,
96
- "hit_rate": hit_rate,
97
- }
98
-
99
-
100
- class DocumentSummarizerTool(BaseToolAdapter):
101
- """
102
- Document summarizer tool for intelligent document processing.
103
-
104
- WHY: Claude Code accumulates massive memory from reading full files,
105
- leading to context overflow. This tool reduces document size by 60%+
106
- while preserving essential information through intelligent summarization.
107
-
108
- DESIGN DECISIONS:
109
- - Use sentence boundary detection to preserve readability
110
- - Implement multiple summarization modes for different use cases
111
- - Cache summaries to avoid re-processing frequently accessed files
112
- - Support common file formats used in development
113
- """
114
-
115
- # File size limits (in bytes)
116
- MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB
117
- CHUNK_SIZE = 50000 # Characters per chunk for large files
118
-
119
- # Token estimation (rough approximation)
120
- CHARS_PER_TOKEN = 4 # Approximate for Claude's tokenizer
121
-
122
- def __init__(self):
123
- """Initialize the document summarizer tool."""
124
- definition = MCPToolDefinition(
125
- name="document_summarizer",
126
- description="Intelligently summarizes documents to reduce memory usage while preserving key information",
127
- input_schema={
128
- "type": "object",
129
- "properties": {
130
- "file_path": {
131
- "type": "string",
132
- "description": "Path to the document file",
133
- },
134
- "mode": {
135
- "type": "string",
136
- "enum": ["brief", "detailed", "key_points", "technical"],
137
- "description": "Summarization mode",
138
- "default": "brief",
139
- },
140
- "max_tokens": {
141
- "type": "integer",
142
- "description": "Maximum tokens in summary (optional)",
143
- "minimum": 100,
144
- "maximum": 10000,
145
- },
146
- "max_percentage": {
147
- "type": "integer",
148
- "description": "Maximum percentage of original to keep (1-100)",
149
- "minimum": 1,
150
- "maximum": 100,
151
- "default": 40,
152
- },
153
- "preserve_code": {
154
- "type": "boolean",
155
- "description": "Whether to preserve code blocks intact",
156
- "default": True,
157
- },
158
- "use_cache": {
159
- "type": "boolean",
160
- "description": "Whether to use cached summaries",
161
- "default": True,
162
- },
163
- },
164
- "required": ["file_path"],
165
- },
166
- output_schema={
167
- "type": "object",
168
- "properties": {
169
- "summary": {
170
- "type": "string",
171
- "description": "The summarized content",
172
- },
173
- "original_size": {
174
- "type": "integer",
175
- "description": "Original document size in bytes",
176
- },
177
- "summary_size": {
178
- "type": "integer",
179
- "description": "Summary size in bytes",
180
- },
181
- "reduction_percentage": {
182
- "type": "number",
183
- "description": "Percentage reduction achieved",
184
- },
185
- "token_estimate": {
186
- "type": "object",
187
- "properties": {
188
- "original": {"type": "integer"},
189
- "summary": {"type": "integer"},
190
- "saved": {"type": "integer"},
191
- },
192
- },
193
- "chunks_processed": {
194
- "type": "integer",
195
- "description": "Number of chunks processed for large files",
196
- },
197
- "cache_hit": {
198
- "type": "boolean",
199
- "description": "Whether summary was retrieved from cache",
200
- },
201
- },
202
- },
203
- version="1.0.0",
204
- metadata={
205
- "category": "document_processing",
206
- "supported_formats": [
207
- "txt",
208
- "md",
209
- "pdf",
210
- "docx",
211
- "json",
212
- "yaml",
213
- "csv",
214
- "py",
215
- "js",
216
- "ts",
217
- "java",
218
- "cpp",
219
- "c",
220
- "h",
221
- "hpp",
222
- ],
223
- },
224
- )
225
- super().__init__(definition)
226
-
227
- # Initialize cache
228
- self._cache = LRUCache(max_size=100, max_memory_mb=50)
229
-
230
- # Sentence boundary patterns
231
- self._sentence_endings = re.compile(r"[.!?]\s+")
232
-
233
- # Code block patterns for different formats
234
- self._code_patterns = {
235
- "markdown": re.compile(r"```[\s\S]*?```", re.MULTILINE),
236
- "inline": re.compile(r"`[^`]+`"),
237
- "indent": re.compile(r"^( |\t).*$", re.MULTILINE),
238
- }
239
-
240
- def _get_file_hash(self, file_path: str) -> str:
241
- """Generate hash for file caching."""
242
- stat = Path(file_path).stat()
243
- hash_input = f"{file_path}:{stat.st_size}:{stat.st_mtime}"
244
- return hashlib.md5(hash_input.encode()).hexdigest()
245
-
246
- def _estimate_tokens(self, text: str) -> int:
247
- """Estimate token count for text."""
248
- return len(text) // self.CHARS_PER_TOKEN
249
-
250
- def _validate_file(self, file_path: str) -> Tuple[bool, Optional[str]]:
251
- """
252
- Validate file for processing.
253
-
254
- Returns:
255
- Tuple of (is_valid, error_message)
256
- """
257
- path = Path(file_path)
258
-
259
- # Check if file exists
260
- if not path.exists():
261
- return False, f"File not found: {file_path}"
262
-
263
- # Check if it's a file (not directory)
264
- if not path.is_file():
265
- return False, f"Path is not a file: {file_path}"
266
-
267
- # Check file size
268
- file_size = path.stat().st_size
269
- if file_size > self.MAX_FILE_SIZE:
270
- return (
271
- False,
272
- f"File too large: {file_size} bytes (max: {self.MAX_FILE_SIZE})",
273
- )
274
-
275
- # Check file extension
276
- extension = path.suffix.lower().lstrip(".")
277
- supported = self._definition.metadata.get("supported_formats", [])
278
- if extension and extension not in supported:
279
- # Try to detect by mime type
280
- mime_type, _ = mimetypes.guess_type(file_path)
281
- if not mime_type or not mime_type.startswith("text/"):
282
- return False, f"Unsupported file format: {extension}"
283
-
284
- return True, None
285
-
286
- def _read_file(self, file_path: str) -> str:
287
- """
288
- Read file content with appropriate encoding.
289
-
290
- Args:
291
- file_path: Path to file
292
-
293
- Returns:
294
- File content as string
295
- """
296
- path = Path(file_path)
297
-
298
- # Try different encodings
299
- encodings = ["utf-8", "latin-1", "cp1252"]
300
-
301
- for encoding in encodings:
302
- try:
303
- return path.read_text(encoding=encoding)
304
- except UnicodeDecodeError:
305
- continue
306
-
307
- # If all fail, read as binary and decode with errors='ignore'
308
- with file_path.open("rb") as f:
309
- content = f.read()
310
- return content.decode("utf-8", errors="ignore")
311
-
312
- def _extract_code_blocks(self, text: str) -> Tuple[List[str], str]:
313
- """
314
- Extract code blocks from text for preservation.
315
-
316
- Returns:
317
- Tuple of (code_blocks, text_without_code)
318
- """
319
- code_blocks = []
320
- placeholder_template = "[[CODE_BLOCK_{}]]"
321
-
322
- # Extract markdown code blocks
323
- for match in self._code_patterns["markdown"].finditer(text):
324
- code_blocks.append(match.group(0))
325
- text = text.replace(
326
- match.group(0), placeholder_template.format(len(code_blocks) - 1)
327
- )
328
-
329
- return code_blocks, text
330
-
331
- def _restore_code_blocks(self, text: str, code_blocks: List[str]) -> str:
332
- """Restore code blocks to summarized text."""
333
- for i, block in enumerate(code_blocks):
334
- placeholder = f"[[CODE_BLOCK_{i}]]"
335
- text = text.replace(placeholder, block)
336
- return text
337
-
338
- def _truncate_at_sentence(self, text: str, max_chars: int) -> str:
339
- """
340
- Truncate text at sentence boundary.
341
-
342
- WHY: Truncating mid-sentence makes summaries harder to read and
343
- can lose important context. Sentence boundaries preserve meaning.
344
- """
345
- if len(text) <= max_chars:
346
- return text
347
-
348
- # Find sentence boundaries
349
- sentences = self._sentence_endings.split(text)
350
-
351
- result = []
352
- current_length = 0
353
-
354
- for i, sentence in enumerate(sentences):
355
- # Add sentence ending back if not last sentence
356
- if i < len(sentences) - 1:
357
- sentence += ". "
358
-
359
- if current_length + len(sentence) <= max_chars:
360
- result.append(sentence)
361
- current_length += len(sentence)
362
- else:
363
- # Add partial sentence if we haven't added anything yet
364
- if not result and sentence:
365
- result.append(sentence[: max_chars - 3] + "...")
366
- break
367
-
368
- return "".join(result)
369
-
370
- def _summarize_brief(self, text: str, max_chars: int) -> str:
371
- """
372
- Brief summarization - first and last portions.
373
-
374
- WHY: For quick overview, showing beginning and end gives context
375
- about what the document covers and its conclusions.
376
- """
377
- if len(text) <= max_chars:
378
- return text
379
-
380
- # Split available space between beginning and end
381
- half_chars = max_chars // 2 - 20 # Reserve space for separator
382
-
383
- beginning = self._truncate_at_sentence(text, half_chars)
384
- ending = self._truncate_at_sentence(text[-half_chars * 2 :], half_chars)
385
-
386
- return f"{beginning}\n\n[... content omitted for brevity ...]\n\n{ending}"
387
-
388
- def _summarize_detailed(self, text: str, max_chars: int) -> str:
389
- """
390
- Detailed summarization - extract key paragraphs.
391
-
392
- WHY: For technical documents, we want to preserve more structure
393
- and include middle sections that might contain important details.
394
- """
395
- if len(text) <= max_chars:
396
- return text
397
-
398
- # Split into paragraphs
399
- paragraphs = text.split("\n\n")
400
-
401
- # Calculate importance scores (based on length and position)
402
- scored_paragraphs = []
403
- for i, para in enumerate(paragraphs):
404
- # Skip empty paragraphs
405
- if not para.strip():
406
- continue
407
-
408
- # Score based on position (beginning and end are important)
409
- position_score = 1.0
410
- if i < 3: # First 3 paragraphs
411
- position_score = 2.0
412
- elif i >= len(paragraphs) - 3: # Last 3 paragraphs
413
- position_score = 1.5
414
-
415
- # Score based on content indicators
416
- content_score = 1.0
417
- if any(
418
- keyword in para.lower()
419
- for keyword in ["summary", "conclusion", "important", "note", "warning"]
420
- ):
421
- content_score = 1.5
422
-
423
- score = position_score * content_score * (1 + len(para) / 1000)
424
- scored_paragraphs.append((score, i, para))
425
-
426
- # Sort by score and select top paragraphs
427
- scored_paragraphs.sort(reverse=True)
428
-
429
- selected = []
430
- current_length = 0
431
-
432
- for score, original_index, para in scored_paragraphs:
433
- truncated_para = self._truncate_at_sentence(
434
- para, max_chars - current_length
435
- )
436
- if current_length + len(truncated_para) <= max_chars:
437
- selected.append((original_index, truncated_para))
438
- current_length += len(truncated_para) + 2 # Account for newlines
439
-
440
- if current_length >= max_chars * 0.9: # Stop at 90% to leave some buffer
441
- break
442
-
443
- # Sort selected paragraphs by original order
444
- selected.sort()
445
-
446
- return "\n\n".join(para for _, para in selected)
447
-
448
- def _summarize_key_points(self, text: str, max_chars: int) -> str:
449
- """
450
- Extract key points and bullet points.
451
-
452
- WHY: Many documents have lists, bullet points, or numbered items
453
- that contain the most important information in condensed form.
454
- """
455
- if len(text) <= max_chars:
456
- return text
457
-
458
- lines = text.split("\n")
459
- key_lines = []
460
-
461
- # Patterns for identifying key points
462
- list_patterns = [
463
- re.compile(r"^\s*[-*•]\s+"), # Bullet points
464
- re.compile(r"^\s*\d+[.)]\s+"), # Numbered lists
465
- re.compile(r"^\s*[A-Z][.)]\s+"), # Letter lists
466
- re.compile(r"^#+\s+"), # Markdown headers
467
- re.compile(r"^[A-Z][^.!?]*:"), # Definition lists
468
- ]
469
-
470
- # Extract lines that match key point patterns
471
- for line in lines:
472
- if any(pattern.match(line) for pattern in list_patterns):
473
- key_lines.append(line)
474
-
475
- # If we found key points, use them
476
- if key_lines:
477
- result = "\n".join(key_lines)
478
- if len(result) <= max_chars:
479
- return result
480
- return self._truncate_at_sentence(result, max_chars)
481
-
482
- # Fallback to brief summary if no key points found
483
- return self._summarize_brief(text, max_chars)
484
-
485
- def _summarize_technical(
486
- self, text: str, max_chars: int, preserve_code: bool
487
- ) -> str:
488
- """
489
- Technical summarization - preserve code and technical details.
490
-
491
- WHY: For code files and technical documentation, we need to
492
- preserve function signatures, class definitions, and important code.
493
- """
494
- if len(text) <= max_chars:
495
- return text
496
-
497
- # Extract and preserve code blocks if requested
498
- code_blocks = []
499
- text_without_code = text
500
-
501
- if preserve_code:
502
- code_blocks, text_without_code = self._extract_code_blocks(text)
503
-
504
- # Extract technical patterns
505
- tech_patterns = [
506
- re.compile(
507
- r"^(class|def|function|interface|struct)\s+\w+.*$", re.MULTILINE
508
- ), # Definitions
509
- re.compile(
510
- r"^(import|from|require|include|using)\s+.*$", re.MULTILINE
511
- ), # Imports
512
- re.compile(r"^\s*@\w+.*$", re.MULTILINE), # Decorators/Annotations
513
- re.compile(
514
- r"^(public|private|protected|static).*\{?$", re.MULTILINE
515
- ), # Method signatures
516
- ]
517
-
518
- important_lines = []
519
- for pattern in tech_patterns:
520
- important_lines.extend(pattern.findall(text_without_code))
521
-
522
- # Build technical summary
523
- result_parts = []
524
-
525
- # Add imports/includes first
526
- imports = [
527
- line
528
- for line in important_lines
529
- if any(
530
- keyword in line
531
- for keyword in ["import", "from", "require", "include", "using"]
532
- )
533
- ]
534
- if imports:
535
- result_parts.append("# Imports/Dependencies\n" + "\n".join(imports[:10]))
536
-
537
- # Add class/function definitions
538
- definitions = [
539
- line
540
- for line in important_lines
541
- if any(
542
- keyword in line
543
- for keyword in ["class", "def", "function", "interface", "struct"]
544
- )
545
- ]
546
- if definitions:
547
- result_parts.append("# Key Definitions\n" + "\n".join(definitions[:20]))
548
-
549
- # Add some code blocks if space allows
550
- if preserve_code and code_blocks:
551
- result_parts.append("# Code Samples")
552
- for _i, block in enumerate(code_blocks[:3]): # Limit to first 3 blocks
553
- if len("\n".join(result_parts)) + len(block) < max_chars * 0.8:
554
- result_parts.append(block)
555
-
556
- result = "\n\n".join(result_parts)
557
-
558
- # If still too long, truncate
559
- if len(result) > max_chars:
560
- result = self._truncate_at_sentence(result, max_chars)
561
-
562
- return result
563
-
564
- def _process_chunks(
565
- self, text: str, mode: str, max_chars_per_chunk: int, preserve_code: bool
566
- ) -> str:
567
- """
568
- Process large documents in chunks.
569
-
570
- WHY: Very large documents need to be processed in chunks to
571
- avoid memory issues and maintain performance.
572
- """
573
- chunks = []
574
- chunk_size = self.CHUNK_SIZE
575
-
576
- for i in range(0, len(text), chunk_size):
577
- chunk = text[i : i + chunk_size]
578
-
579
- # Summarize chunk based on mode
580
- if mode == "brief":
581
- summarized = self._summarize_brief(chunk, max_chars_per_chunk)
582
- elif mode == "detailed":
583
- summarized = self._summarize_detailed(chunk, max_chars_per_chunk)
584
- elif mode == "key_points":
585
- summarized = self._summarize_key_points(chunk, max_chars_per_chunk)
586
- elif mode == "technical":
587
- summarized = self._summarize_technical(
588
- chunk, max_chars_per_chunk, preserve_code
589
- )
590
- else:
591
- summarized = self._summarize_brief(chunk, max_chars_per_chunk)
592
-
593
- chunks.append(summarized)
594
-
595
- return "\n\n[--- Next Section ---]\n\n".join(chunks)
596
-
597
- async def invoke(self, invocation: MCPToolInvocation) -> MCPToolResult:
598
- """
599
- Invoke the document summarizer tool.
600
-
601
- Args:
602
- invocation: Tool invocation request
603
-
604
- Returns:
605
- Tool execution result with summary
606
- """
607
- start_time = datetime.now(timezone.utc)
608
-
609
- try:
610
- # Get parameters
611
- file_path = invocation.parameters["file_path"]
612
- mode = invocation.parameters.get("mode", "brief")
613
- max_tokens = invocation.parameters.get("max_tokens")
614
- max_percentage = invocation.parameters.get("max_percentage", 40)
615
- preserve_code = invocation.parameters.get("preserve_code", True)
616
- use_cache = invocation.parameters.get("use_cache", True)
617
-
618
- # Validate file
619
- is_valid, error_msg = self._validate_file(file_path)
620
- if not is_valid:
621
- raise ValueError(error_msg)
622
-
623
- # Check cache if enabled
624
- cache_hit = False
625
- if use_cache:
626
- cache_key = f"{self._get_file_hash(file_path)}:{mode}:{max_percentage}"
627
- cached_result = self._cache.get(cache_key)
628
- if cached_result:
629
- cache_hit = True
630
- execution_time = (
631
- datetime.now(timezone.utc) - start_time
632
- ).total_seconds()
633
- self._update_metrics(True, execution_time)
634
-
635
- return MCPToolResult(
636
- success=True,
637
- data={
638
- **cached_result,
639
- "cache_hit": True,
640
- "cache_stats": self._cache.get_stats(),
641
- },
642
- execution_time=execution_time,
643
- metadata={
644
- "tool": "document_summarizer",
645
- "mode": mode,
646
- "cached": True,
647
- },
648
- )
649
-
650
- # Read file content
651
- content = self._read_file(file_path)
652
- original_size = len(content)
653
-
654
- # Calculate target size
655
- if max_tokens:
656
- max_chars = max_tokens * self.CHARS_PER_TOKEN
657
- else:
658
- max_chars = int(original_size * (max_percentage / 100))
659
-
660
- # Process based on file size
661
- chunks_processed = 1
662
- if original_size > self.CHUNK_SIZE:
663
- # Process in chunks for large files
664
- chunks_processed = (original_size // self.CHUNK_SIZE) + 1
665
- max_chars_per_chunk = max_chars // chunks_processed
666
- summary = self._process_chunks(
667
- content, mode, max_chars_per_chunk, preserve_code
668
- )
669
- # Process entire file
670
- elif mode == "brief":
671
- summary = self._summarize_brief(content, max_chars)
672
- elif mode == "detailed":
673
- summary = self._summarize_detailed(content, max_chars)
674
- elif mode == "key_points":
675
- summary = self._summarize_key_points(content, max_chars)
676
- elif mode == "technical":
677
- summary = self._summarize_technical(content, max_chars, preserve_code)
678
- else:
679
- summary = self._summarize_brief(content, max_chars)
680
-
681
- # Calculate metrics
682
- summary_size = len(summary)
683
- reduction_percentage = (
684
- (original_size - summary_size) / original_size
685
- ) * 100
686
-
687
- # Token estimates
688
- original_tokens = self._estimate_tokens(content)
689
- summary_tokens = self._estimate_tokens(summary)
690
- saved_tokens = original_tokens - summary_tokens
691
-
692
- # Prepare result
693
- result = {
694
- "summary": summary,
695
- "original_size": original_size,
696
- "summary_size": summary_size,
697
- "reduction_percentage": round(reduction_percentage, 2),
698
- "token_estimate": {
699
- "original": original_tokens,
700
- "summary": summary_tokens,
701
- "saved": saved_tokens,
702
- },
703
- "chunks_processed": chunks_processed,
704
- "cache_hit": cache_hit,
705
- }
706
-
707
- # Cache result if enabled
708
- if use_cache and not cache_hit:
709
- cache_key = f"{self._get_file_hash(file_path)}:{mode}:{max_percentage}"
710
- self._cache.put(cache_key, result.copy(), summary_size)
711
-
712
- # Calculate execution time
713
- execution_time = (datetime.now(timezone.utc) - start_time).total_seconds()
714
-
715
- # Update metrics
716
- self._update_metrics(True, execution_time)
717
-
718
- # Add cache stats to result
719
- result["cache_stats"] = self._cache.get_stats()
720
-
721
- return MCPToolResult(
722
- success=True,
723
- data=result,
724
- execution_time=execution_time,
725
- metadata={
726
- "tool": "document_summarizer",
727
- "mode": mode,
728
- "file_path": file_path,
729
- "reduction_achieved": reduction_percentage >= 60,
730
- },
731
- )
732
-
733
- except Exception as e:
734
- execution_time = (datetime.now(timezone.utc) - start_time).total_seconds()
735
- self._update_metrics(False, execution_time)
736
- self._metrics["last_error"] = str(e)
737
-
738
- self.log_error(f"Document summarizer failed: {e}")
739
-
740
- return MCPToolResult(
741
- success=False,
742
- error=f"Document summarizer failed: {e!s}",
743
- execution_time=execution_time,
744
- metadata={
745
- "tool": "document_summarizer",
746
- "error_type": type(e).__name__,
747
- },
748
- )
749
-
750
- async def initialize(self) -> bool:
751
- """
752
- Initialize the document summarizer tool.
753
-
754
- Returns:
755
- True if initialization successful
756
- """
757
- try:
758
- self.log_info("Initializing document summarizer tool")
759
-
760
- # Clear cache on initialization
761
- self._cache = LRUCache(max_size=100, max_memory_mb=50)
762
-
763
- self._initialized = True
764
- self.log_info("Document summarizer tool initialized successfully")
765
- return True
766
-
767
- except Exception as e:
768
- self.log_error(f"Failed to initialize document summarizer: {e}")
769
- return False
770
-
771
- async def shutdown(self) -> None:
772
- """
773
- Shutdown the document summarizer tool and clean up resources.
774
- """
775
- try:
776
- self.log_info("Shutting down document summarizer tool")
777
-
778
- # Log final cache stats
779
- cache_stats = self._cache.get_stats()
780
- self.log_info(f"Final cache stats: {cache_stats}")
781
-
782
- # Clear cache
783
- self._cache = None
784
-
785
- self._initialized = False
786
- self.log_info("Document summarizer tool shutdown complete")
787
-
788
- except Exception as e:
789
- self.log_error(f"Error during document summarizer shutdown: {e}")