claude-mpm 5.0.9__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 (263) 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/{PM_INSTRUCTIONS_TEACH.md → CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md} +721 -41
  5. claude_mpm/agents/MEMORY.md +1 -1
  6. claude_mpm/agents/PM_INSTRUCTIONS.md +468 -468
  7. claude_mpm/agents/WORKFLOW.md +5 -254
  8. claude_mpm/agents/agent_loader.py +13 -44
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/frontmatter_validator.py +70 -2
  11. claude_mpm/agents/templates/circuit-breakers.md +431 -45
  12. claude_mpm/cli/__init__.py +0 -1
  13. claude_mpm/cli/__main__.py +4 -0
  14. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  15. claude_mpm/cli/commands/agent_state_manager.py +18 -27
  16. claude_mpm/cli/commands/agents.py +175 -37
  17. claude_mpm/cli/commands/auto_configure.py +723 -236
  18. claude_mpm/cli/commands/config.py +88 -2
  19. claude_mpm/cli/commands/configure.py +1262 -157
  20. claude_mpm/cli/commands/configure_agent_display.py +25 -6
  21. claude_mpm/cli/commands/mpm_init/core.py +225 -46
  22. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  23. claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
  24. claude_mpm/cli/commands/postmortem.py +1 -1
  25. claude_mpm/cli/commands/profile.py +277 -0
  26. claude_mpm/cli/commands/skills.py +214 -189
  27. claude_mpm/cli/commands/summarize.py +413 -0
  28. claude_mpm/cli/executor.py +21 -3
  29. claude_mpm/cli/interactive/agent_wizard.py +85 -10
  30. claude_mpm/cli/parsers/agents_parser.py +54 -9
  31. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  32. claude_mpm/cli/parsers/base_parser.py +12 -0
  33. claude_mpm/cli/parsers/config_parser.py +153 -83
  34. claude_mpm/cli/parsers/profile_parser.py +148 -0
  35. claude_mpm/cli/parsers/skills_parser.py +3 -2
  36. claude_mpm/cli/startup.py +879 -149
  37. claude_mpm/commands/mpm-config.md +28 -0
  38. claude_mpm/commands/mpm-doctor.md +9 -22
  39. claude_mpm/commands/mpm-help.md +5 -287
  40. claude_mpm/commands/mpm-init.md +81 -507
  41. claude_mpm/commands/mpm-monitor.md +15 -402
  42. claude_mpm/commands/mpm-organize.md +120 -0
  43. claude_mpm/commands/mpm-postmortem.md +6 -108
  44. claude_mpm/commands/mpm-session-resume.md +12 -363
  45. claude_mpm/commands/mpm-status.md +5 -69
  46. claude_mpm/commands/mpm-ticket-view.md +52 -495
  47. claude_mpm/commands/mpm-version.md +5 -107
  48. claude_mpm/config/agent_sources.py +27 -0
  49. claude_mpm/core/config.py +2 -4
  50. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  51. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  52. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  53. claude_mpm/core/framework_loader.py +4 -2
  54. claude_mpm/core/logger.py +13 -0
  55. claude_mpm/core/optimized_startup.py +59 -0
  56. claude_mpm/core/output_style_manager.py +173 -43
  57. claude_mpm/core/shared/config_loader.py +1 -1
  58. claude_mpm/core/socketio_pool.py +3 -3
  59. claude_mpm/core/unified_agent_registry.py +134 -16
  60. claude_mpm/core/unified_config.py +22 -0
  61. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  62. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  63. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  64. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  65. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  66. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  67. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  68. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  69. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  70. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  71. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  72. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  73. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  74. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  75. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  76. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  77. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  78. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  79. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  80. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  81. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  82. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  83. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  84. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  85. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  86. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  87. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  88. claude_mpm/hooks/claude_hooks/event_handlers.py +211 -78
  89. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  90. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  91. claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
  92. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  93. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  94. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  95. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  96. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  97. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  98. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  99. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  100. claude_mpm/hooks/memory_integration_hook.py +46 -1
  101. claude_mpm/init.py +63 -19
  102. claude_mpm/models/agent_definition.py +7 -0
  103. claude_mpm/models/git_repository.py +3 -3
  104. claude_mpm/scripts/claude-hook-handler.sh +58 -18
  105. claude_mpm/scripts/launch_monitor.py +93 -13
  106. claude_mpm/scripts/start_activity_logging.py +0 -0
  107. claude_mpm/services/agents/agent_builder.py +3 -3
  108. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  109. claude_mpm/services/agents/agent_review_service.py +280 -0
  110. claude_mpm/services/agents/cache_git_manager.py +6 -6
  111. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  112. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -5
  113. claude_mpm/services/agents/deployment/agent_template_builder.py +5 -3
  114. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  115. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +320 -29
  116. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +546 -68
  117. claude_mpm/services/agents/git_source_manager.py +36 -2
  118. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  119. claude_mpm/services/agents/recommender.py +5 -3
  120. claude_mpm/services/agents/single_tier_deployment_service.py +2 -2
  121. claude_mpm/services/agents/sources/git_source_sync_service.py +13 -6
  122. claude_mpm/services/agents/startup_sync.py +22 -2
  123. claude_mpm/services/agents/toolchain_detector.py +10 -6
  124. claude_mpm/services/analysis/__init__.py +11 -1
  125. claude_mpm/services/analysis/clone_detector.py +1030 -0
  126. claude_mpm/services/command_deployment_service.py +81 -10
  127. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  128. claude_mpm/services/diagnostics/checks/agent_sources_check.py +1 -1
  129. claude_mpm/services/event_bus/config.py +3 -1
  130. claude_mpm/services/git/git_operations_service.py +101 -16
  131. claude_mpm/services/monitor/daemon.py +9 -2
  132. claude_mpm/services/monitor/daemon_manager.py +39 -3
  133. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  134. claude_mpm/services/monitor/server.py +698 -22
  135. claude_mpm/services/pm_skills_deployer.py +676 -0
  136. claude_mpm/services/profile_manager.py +331 -0
  137. claude_mpm/services/project/project_organizer.py +4 -0
  138. claude_mpm/services/self_upgrade_service.py +120 -12
  139. claude_mpm/services/skills/__init__.py +3 -0
  140. claude_mpm/services/skills/git_skill_source_manager.py +130 -2
  141. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  142. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  143. claude_mpm/services/skills_deployer.py +126 -9
  144. claude_mpm/services/socketio/dashboard_server.py +1 -0
  145. claude_mpm/services/socketio/event_normalizer.py +51 -6
  146. claude_mpm/services/socketio/server/core.py +386 -108
  147. claude_mpm/services/version_control/git_operations.py +103 -0
  148. claude_mpm/skills/skill_manager.py +92 -3
  149. claude_mpm/utils/agent_dependency_loader.py +14 -2
  150. claude_mpm/utils/agent_filters.py +17 -44
  151. claude_mpm/utils/gitignore.py +3 -0
  152. claude_mpm/utils/migration.py +4 -4
  153. claude_mpm/utils/robust_installer.py +47 -3
  154. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +57 -87
  155. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +160 -211
  156. claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
  157. claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
  158. claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
  159. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  160. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  161. claude_mpm/agents/BASE_OPS.md +0 -219
  162. claude_mpm/agents/BASE_PM.md +0 -480
  163. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  164. claude_mpm/agents/BASE_QA.md +0 -167
  165. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  166. claude_mpm/agents/base_agent_loader.py +0 -601
  167. claude_mpm/cli/commands/agents_detect.py +0 -380
  168. claude_mpm/cli/commands/agents_recommend.py +0 -309
  169. claude_mpm/cli/ticket_cli.py +0 -35
  170. claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
  171. claude_mpm/commands/mpm-agents-detect.md +0 -177
  172. claude_mpm/commands/mpm-agents-list.md +0 -131
  173. claude_mpm/commands/mpm-agents-recommend.md +0 -223
  174. claude_mpm/commands/mpm-config-view.md +0 -150
  175. claude_mpm/commands/mpm-ticket-organize.md +0 -304
  176. claude_mpm/dashboard/analysis_runner.py +0 -455
  177. claude_mpm/dashboard/index.html +0 -13
  178. claude_mpm/dashboard/open_dashboard.py +0 -66
  179. claude_mpm/dashboard/static/css/activity.css +0 -1958
  180. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  181. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  182. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  183. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  184. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  185. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  186. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  187. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  188. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  189. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  190. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  191. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  192. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  193. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  194. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  195. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  196. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  197. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  198. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  199. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  200. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  201. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  202. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  203. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  204. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  205. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  206. claude_mpm/dashboard/static/js/dashboard.js +0 -1914
  207. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  208. claude_mpm/dashboard/static/js/socket-client.js +0 -1474
  209. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  210. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  211. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  212. claude_mpm/dashboard/templates/code_simple.html +0 -153
  213. claude_mpm/dashboard/templates/index.html +0 -606
  214. claude_mpm/dashboard/test_dashboard.html +0 -372
  215. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  216. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  217. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  218. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  219. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  220. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  221. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  222. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  223. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  224. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  225. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  226. claude_mpm/scripts/mcp_server.py +0 -75
  227. claude_mpm/scripts/mcp_wrapper.py +0 -39
  228. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  229. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  230. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  231. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  232. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  233. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  234. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  235. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  236. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  237. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
  239. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  240. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  241. claude_mpm/services/mcp_gateway/main.py +0 -589
  242. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  243. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  244. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  245. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  246. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
  247. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  248. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
  249. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  250. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  251. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  252. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  253. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  254. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  255. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
  256. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  257. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  258. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  259. claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
  260. claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
  261. /claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +0 -0
  262. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
  263. {claude_mpm-5.0.9.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
@@ -50,10 +50,10 @@ class GitSourceManager:
50
50
 
51
51
  Args:
52
52
  cache_root: Root directory for repository caches.
53
- Defaults to ~/.claude-mpm/cache/remote-agents/
53
+ Defaults to ~/.claude-mpm/cache/agents/
54
54
  """
55
55
  if cache_root is None:
56
- cache_root = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
56
+ cache_root = Path.home() / ".claude-mpm" / "cache" / "agents"
57
57
 
58
58
  self.cache_root = cache_root
59
59
  self.cache_root.mkdir(parents=True, exist_ok=True)
@@ -339,14 +339,48 @@ class GitSourceManager:
339
339
 
340
340
  # Walk cache directory structure
341
341
  logger.debug(f"[DEBUG] Walking cache root: {self.cache_root}")
342
+
343
+ # Known legacy category directories to skip (flat cache structure)
344
+ LEGACY_CATEGORIES = {
345
+ "universal",
346
+ "engineer",
347
+ "ops",
348
+ "qa",
349
+ "security",
350
+ "documentation",
351
+ "claude-mpm",
352
+ }
353
+
354
+ # Repositories that are NOT agent repositories (should be excluded from agent discovery)
355
+ # These contain skills, documentation, or other non-agent content
356
+ EXCLUDED_REPOSITORIES = {
357
+ "claude-mpm-skills", # Skills repository, not agents
358
+ }
359
+
342
360
  for owner_dir in self.cache_root.iterdir():
343
361
  if not owner_dir.is_dir():
344
362
  continue
363
+
364
+ # Skip legacy category directories (they're not GitHub owners)
365
+ if owner_dir.name.lower() in LEGACY_CATEGORIES:
366
+ logger.debug(
367
+ f"[DEBUG] Skipping legacy category directory: {owner_dir.name}"
368
+ )
369
+ continue
370
+
345
371
  logger.debug(f"[DEBUG] Processing owner_dir: {owner_dir.name}")
346
372
 
347
373
  for repo_dir in owner_dir.iterdir():
348
374
  if not repo_dir.is_dir():
349
375
  continue
376
+
377
+ # Skip excluded repositories (e.g., skills repos are not agent repos)
378
+ if repo_dir.name in EXCLUDED_REPOSITORIES:
379
+ logger.debug(
380
+ f"[DEBUG] Skipping excluded repository: {repo_dir.name}"
381
+ )
382
+ continue
383
+
350
384
  logger.debug(f"[DEBUG] Processing repo_dir: {repo_dir.name}")
351
385
 
352
386
  # Bug #5 fix: Don't iterate subdirectories - RemoteAgentDiscoveryService
@@ -13,9 +13,6 @@ from enum import Enum
13
13
  from pathlib import Path
14
14
  from typing import Any, Dict, List, Optional
15
15
 
16
- # Lazy import for base_agent_loader to reduce initialization overhead
17
- # base_agent_loader adds ~500ms to import time
18
- # from claude_mpm.agents.base_agent_loader import clear_base_agent_cache
19
16
  from claude_mpm.core.logging_utils import get_logger
20
17
  from claude_mpm.services.memory.cache.shared_prompt_cache import SharedPromptCache
21
18
  from claude_mpm.services.shared import ConfigServiceBase
@@ -23,13 +20,6 @@ from claude_mpm.services.shared import ConfigServiceBase
23
20
  logger = get_logger(__name__)
24
21
 
25
22
 
26
- def _get_clear_base_agent_cache():
27
- """Lazy loader for clear_base_agent_cache function."""
28
- from claude_mpm.agents.base_agent_loader import clear_base_agent_cache
29
-
30
- return clear_base_agent_cache
31
-
32
-
33
23
  class BaseAgentSection(str, Enum):
34
24
  """Base agent markdown sections."""
35
25
 
@@ -143,9 +133,7 @@ class BaseAgentManager(ConfigServiceBase):
143
133
  content = self._structure_to_markdown(current)
144
134
  self.base_agent_path.write_text(content, encoding="utf-8")
145
135
 
146
- # Clear caches (lazy load to avoid import overhead)
147
- clear_base_agent_cache = _get_clear_base_agent_cache()
148
- clear_base_agent_cache()
136
+ # Clear cache
149
137
  self.cache.invalidate("base_agent:instructions")
150
138
 
151
139
  logger.info("Base agent updated successfully")
@@ -226,9 +226,11 @@ class AgentRecommenderService(BaseService, IAgentRecommender):
226
226
  if max_agents is not None:
227
227
  recommendations = recommendations[:max_agents]
228
228
 
229
- # Check if toolchain is unknown and we have no recommendations
230
- if not recommendations and toolchain.primary_language.lower() == "unknown":
231
- self.logger.info("Toolchain unknown - applying default configuration")
229
+ # Check if we have no recommendations (any reason: unknown language, low scores, etc.)
230
+ if not recommendations:
231
+ self.logger.info(
232
+ f"No agents scored above threshold for {toolchain.primary_language}; using defaults"
233
+ )
232
234
 
233
235
  # Get default configuration
234
236
  default_config = self._capabilities_config.get("default_configuration", {})
@@ -78,14 +78,14 @@ class SingleTierDeploymentService:
78
78
  config: Agent source configuration with repositories
79
79
  deployment_dir: Target deployment directory (.claude/agents/)
80
80
  cache_root: Cache root for repositories
81
- (defaults to ~/.claude-mpm/cache/remote-agents/)
81
+ (defaults to ~/.claude-mpm/cache/agents/)
82
82
  """
83
83
  self.config = config
84
84
  self.deployment_dir = deployment_dir
85
85
  self.deployment_dir.mkdir(parents=True, exist_ok=True)
86
86
 
87
87
  if cache_root is None:
88
- cache_root = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
88
+ cache_root = Path.home() / ".claude-mpm" / "cache" / "agents"
89
89
 
90
90
  self.cache_root = cache_root
91
91
  self.git_source_manager = GitSourceManager(cache_root)
@@ -188,10 +188,10 @@ class GitSourceSyncService:
188
188
 
189
189
  Args:
190
190
  source_url: Base URL for raw files (without trailing slash)
191
- cache_dir: Local cache directory (defaults to ~/.claude-mpm/cache/remote-agents/)
191
+ cache_dir: Local cache directory (defaults to ~/.claude-mpm/cache/agents/)
192
192
  source_id: Unique identifier for this source (for multi-source support)
193
193
 
194
- Design Decision: Cache to ~/.claude-mpm/cache/remote-agents/ (canonical location)
194
+ Design Decision: Cache to ~/.claude-mpm/cache/agents/ (canonical location)
195
195
 
196
196
  Rationale: Separates cached repository structure from deployed agents.
197
197
  This allows preserving nested directory structure in cache while
@@ -207,13 +207,13 @@ class GitSourceSyncService:
207
207
  self.source_url = source_url.rstrip("/")
208
208
  self.source_id = source_id
209
209
 
210
- # Setup cache directory (canonical: ~/.claude-mpm/cache/remote-agents/)
210
+ # Setup cache directory (canonical: ~/.claude-mpm/cache/agents/)
211
211
  if cache_dir:
212
212
  self.cache_dir = Path(cache_dir)
213
213
  else:
214
- # Default to ~/.claude-mpm/cache/remote-agents/ (canonical cache location)
214
+ # Default to ~/.claude-mpm/cache/agents/ (canonical cache location)
215
215
  home = Path.home()
216
- self.cache_dir = home / ".claude-mpm" / "cache" / "remote-agents"
216
+ self.cache_dir = home / ".claude-mpm" / "cache" / "agents"
217
217
 
218
218
  self.cache_dir.mkdir(parents=True, exist_ok=True)
219
219
 
@@ -851,6 +851,12 @@ class GitSourceSyncService:
851
851
  if base_path and not path.startswith(base_path + "/"):
852
852
  continue
853
853
 
854
+ # Exclude build/dist directories (prevents double-counting)
855
+ # e.g., both "agents/engineer.md" and "dist/agents/engineer.md"
856
+ path_parts = path.split("/")
857
+ if any(excluded in path_parts for excluded in ["dist", "build", ".cache"]):
858
+ continue
859
+
854
860
  # Remove base_path prefix for relative paths
855
861
  if base_path:
856
862
  relative_path = path[len(base_path) + 1 :]
@@ -971,7 +977,8 @@ class GitSourceSyncService:
971
977
  """
972
978
  import shutil
973
979
 
974
- deployment_dir = project_dir / ".claude-mpm" / "agents"
980
+ # Deploy to .claude/agents/ where Claude Code expects them
981
+ deployment_dir = project_dir / ".claude" / "agents"
975
982
  deployment_dir.mkdir(parents=True, exist_ok=True)
976
983
 
977
984
  results = {
@@ -110,6 +110,26 @@ def sync_agents_on_startup(config: Optional[Dict[str, Any]] = None) -> Dict[str,
110
110
  else:
111
111
  cache_dir = None # Will use default
112
112
 
113
+ # Check for old cache directory names and provide migration guidance
114
+ # This handles users upgrading from older versions
115
+ old_cache_paths = [
116
+ Path.home() / ".claude-mpm" / "cache" / "remote-agents",
117
+ ]
118
+ new_cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
119
+
120
+ for old_cache in old_cache_paths:
121
+ if old_cache.exists() and not new_cache_dir.exists():
122
+ logger.warning(f"Found old cache directory: {old_cache}")
123
+ logger.warning(
124
+ "The cache directory location has changed to: ~/.claude-mpm/cache/agents"
125
+ )
126
+ logger.warning("To migrate your existing cache, run:")
127
+ logger.warning(f" mv {old_cache} {new_cache_dir}")
128
+ logger.info(
129
+ "Agents will be re-synced to the new cache location automatically."
130
+ )
131
+ break # Only show warning once
132
+
113
133
  # Sync each enabled source
114
134
  for source_config in sources:
115
135
  try:
@@ -217,7 +237,7 @@ def get_sync_status() -> Dict[str, Any]:
217
237
  "enabled": agent_sync_config.get("enabled", True),
218
238
  "sources_configured": len(enabled_sources),
219
239
  "cache_dir": agent_sync_config.get(
220
- "cache_dir", "~/.claude-mpm/cache/remote-agents"
240
+ "cache_dir", "~/.claude-mpm/cache/agents"
221
241
  ),
222
242
  }
223
243
 
@@ -233,7 +253,7 @@ def get_sync_status() -> Dict[str, Any]:
233
253
  return {
234
254
  "enabled": False,
235
255
  "sources_configured": 0,
236
- "cache_dir": "~/.claude-mpm/cache/remote-agents",
256
+ "cache_dir": "~/.claude-mpm/cache/agents",
237
257
  "last_sync": None,
238
258
  "error": str(e),
239
259
  }
@@ -158,12 +158,15 @@ class ToolchainDetector:
158
158
  "make": ["ops"],
159
159
  }
160
160
 
161
- # Core agents always included
161
+ # Core agents always included (use exact agent IDs from repository)
162
162
  CORE_AGENTS = [
163
- "qa",
164
- "research",
165
- "documentation",
166
- "ticketing",
163
+ "engineer",
164
+ "qa-agent",
165
+ "memory-manager-agent",
166
+ "local-ops-agent",
167
+ "research-agent",
168
+ "documentation-agent",
169
+ "security-agent",
167
170
  ]
168
171
 
169
172
  # Directories to exclude from scanning
@@ -365,7 +368,8 @@ class ToolchainDetector:
365
368
  """Map detected toolchain to recommended agents.
366
369
 
367
370
  Combines language-specific, framework-specific, and ops agents with
368
- core agents (qa, research, documentation, ticketing).
371
+ core agents (engineer, qa-agent, memory-manager-agent, local-ops-agent, research-agent,
372
+ documentation-agent, security-agent).
369
373
 
370
374
  Args:
371
375
  toolchain: Detected toolchain dictionary with languages, frameworks, tools
@@ -1,9 +1,15 @@
1
1
  """
2
2
  Analysis services for Claude MPM.
3
3
 
4
- Provides postmortem analysis and error improvement suggestions.
4
+ Provides postmortem analysis, error improvement suggestions, and code clone detection.
5
5
  """
6
6
 
7
+ from .clone_detector import (
8
+ CloneDetector,
9
+ CloneReport,
10
+ RefactoringSuggestion,
11
+ SimilarityReport,
12
+ )
7
13
  from .postmortem_service import (
8
14
  ActionType,
9
15
  ErrorAnalysis,
@@ -16,10 +22,14 @@ from .postmortem_service import (
16
22
 
17
23
  __all__ = [
18
24
  "ActionType",
25
+ "CloneDetector",
26
+ "CloneReport",
19
27
  "ErrorAnalysis",
20
28
  "ErrorCategory",
21
29
  "ImprovementAction",
22
30
  "PostmortemReport",
23
31
  "PostmortemService",
32
+ "RefactoringSuggestion",
33
+ "SimilarityReport",
24
34
  "get_postmortem_service",
25
35
  ]