claude-mpm 5.4.96__py3-none-any.whl → 5.6.17__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 (214) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/{CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md → CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md} +14 -6
  3. claude_mpm/agents/PM_INSTRUCTIONS.md +44 -10
  4. claude_mpm/agents/WORKFLOW.md +2 -0
  5. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  6. claude_mpm/cli/commands/autotodos.py +45 -5
  7. claude_mpm/cli/commands/commander.py +216 -0
  8. claude_mpm/cli/commands/hook_errors.py +60 -60
  9. claude_mpm/cli/commands/run.py +35 -3
  10. claude_mpm/cli/commands/skill_source.py +51 -2
  11. claude_mpm/cli/commands/skills.py +5 -3
  12. claude_mpm/cli/executor.py +32 -17
  13. claude_mpm/cli/parsers/base_parser.py +17 -0
  14. claude_mpm/cli/parsers/commander_parser.py +116 -0
  15. claude_mpm/cli/parsers/run_parser.py +10 -0
  16. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  17. claude_mpm/cli/parsers/skills_parser.py +5 -0
  18. claude_mpm/cli/startup.py +124 -3
  19. claude_mpm/cli/startup_display.py +2 -1
  20. claude_mpm/cli/utils.py +7 -3
  21. claude_mpm/commander/__init__.py +78 -0
  22. claude_mpm/commander/adapters/__init__.py +60 -0
  23. claude_mpm/commander/adapters/auggie.py +260 -0
  24. claude_mpm/commander/adapters/base.py +288 -0
  25. claude_mpm/commander/adapters/claude_code.py +392 -0
  26. claude_mpm/commander/adapters/codex.py +237 -0
  27. claude_mpm/commander/adapters/communication.py +366 -0
  28. claude_mpm/commander/adapters/example_usage.py +310 -0
  29. claude_mpm/commander/adapters/mpm.py +389 -0
  30. claude_mpm/commander/adapters/registry.py +204 -0
  31. claude_mpm/commander/api/__init__.py +16 -0
  32. claude_mpm/commander/api/app.py +121 -0
  33. claude_mpm/commander/api/errors.py +133 -0
  34. claude_mpm/commander/api/routes/__init__.py +8 -0
  35. claude_mpm/commander/api/routes/events.py +184 -0
  36. claude_mpm/commander/api/routes/inbox.py +171 -0
  37. claude_mpm/commander/api/routes/messages.py +148 -0
  38. claude_mpm/commander/api/routes/projects.py +271 -0
  39. claude_mpm/commander/api/routes/sessions.py +226 -0
  40. claude_mpm/commander/api/routes/work.py +296 -0
  41. claude_mpm/commander/api/schemas.py +186 -0
  42. claude_mpm/commander/chat/__init__.py +7 -0
  43. claude_mpm/commander/chat/cli.py +111 -0
  44. claude_mpm/commander/chat/commands.py +96 -0
  45. claude_mpm/commander/chat/repl.py +310 -0
  46. claude_mpm/commander/config.py +49 -0
  47. claude_mpm/commander/config_loader.py +115 -0
  48. claude_mpm/commander/core/__init__.py +10 -0
  49. claude_mpm/commander/core/block_manager.py +325 -0
  50. claude_mpm/commander/core/response_manager.py +323 -0
  51. claude_mpm/commander/daemon.py +594 -0
  52. claude_mpm/commander/env_loader.py +59 -0
  53. claude_mpm/commander/events/__init__.py +26 -0
  54. claude_mpm/commander/events/manager.py +332 -0
  55. claude_mpm/commander/frameworks/__init__.py +12 -0
  56. claude_mpm/commander/frameworks/base.py +143 -0
  57. claude_mpm/commander/frameworks/claude_code.py +58 -0
  58. claude_mpm/commander/frameworks/mpm.py +62 -0
  59. claude_mpm/commander/inbox/__init__.py +16 -0
  60. claude_mpm/commander/inbox/dedup.py +128 -0
  61. claude_mpm/commander/inbox/inbox.py +224 -0
  62. claude_mpm/commander/inbox/models.py +70 -0
  63. claude_mpm/commander/instance_manager.py +337 -0
  64. claude_mpm/commander/llm/__init__.py +6 -0
  65. claude_mpm/commander/llm/openrouter_client.py +167 -0
  66. claude_mpm/commander/llm/summarizer.py +70 -0
  67. claude_mpm/commander/memory/__init__.py +45 -0
  68. claude_mpm/commander/memory/compression.py +347 -0
  69. claude_mpm/commander/memory/embeddings.py +230 -0
  70. claude_mpm/commander/memory/entities.py +310 -0
  71. claude_mpm/commander/memory/example_usage.py +290 -0
  72. claude_mpm/commander/memory/integration.py +325 -0
  73. claude_mpm/commander/memory/search.py +381 -0
  74. claude_mpm/commander/memory/store.py +657 -0
  75. claude_mpm/commander/models/__init__.py +18 -0
  76. claude_mpm/commander/models/events.py +121 -0
  77. claude_mpm/commander/models/project.py +162 -0
  78. claude_mpm/commander/models/work.py +214 -0
  79. claude_mpm/commander/parsing/__init__.py +20 -0
  80. claude_mpm/commander/parsing/extractor.py +132 -0
  81. claude_mpm/commander/parsing/output_parser.py +270 -0
  82. claude_mpm/commander/parsing/patterns.py +100 -0
  83. claude_mpm/commander/persistence/__init__.py +11 -0
  84. claude_mpm/commander/persistence/event_store.py +274 -0
  85. claude_mpm/commander/persistence/state_store.py +309 -0
  86. claude_mpm/commander/persistence/work_store.py +164 -0
  87. claude_mpm/commander/polling/__init__.py +13 -0
  88. claude_mpm/commander/polling/event_detector.py +104 -0
  89. claude_mpm/commander/polling/output_buffer.py +49 -0
  90. claude_mpm/commander/polling/output_poller.py +153 -0
  91. claude_mpm/commander/project_session.py +268 -0
  92. claude_mpm/commander/proxy/__init__.py +12 -0
  93. claude_mpm/commander/proxy/formatter.py +89 -0
  94. claude_mpm/commander/proxy/output_handler.py +191 -0
  95. claude_mpm/commander/proxy/relay.py +155 -0
  96. claude_mpm/commander/registry.py +410 -0
  97. claude_mpm/commander/runtime/__init__.py +10 -0
  98. claude_mpm/commander/runtime/executor.py +191 -0
  99. claude_mpm/commander/runtime/monitor.py +346 -0
  100. claude_mpm/commander/session/__init__.py +6 -0
  101. claude_mpm/commander/session/context.py +81 -0
  102. claude_mpm/commander/session/manager.py +59 -0
  103. claude_mpm/commander/tmux_orchestrator.py +361 -0
  104. claude_mpm/commander/web/__init__.py +1 -0
  105. claude_mpm/commander/work/__init__.py +30 -0
  106. claude_mpm/commander/work/executor.py +207 -0
  107. claude_mpm/commander/work/queue.py +405 -0
  108. claude_mpm/commander/workflow/__init__.py +27 -0
  109. claude_mpm/commander/workflow/event_handler.py +241 -0
  110. claude_mpm/commander/workflow/notifier.py +146 -0
  111. claude_mpm/commands/mpm-config.md +8 -0
  112. claude_mpm/commands/mpm-doctor.md +8 -0
  113. claude_mpm/commands/mpm-help.md +8 -0
  114. claude_mpm/commands/mpm-init.md +8 -0
  115. claude_mpm/commands/mpm-monitor.md +8 -0
  116. claude_mpm/commands/mpm-organize.md +8 -0
  117. claude_mpm/commands/mpm-postmortem.md +8 -0
  118. claude_mpm/commands/mpm-session-resume.md +8 -0
  119. claude_mpm/commands/mpm-status.md +8 -0
  120. claude_mpm/commands/mpm-ticket-view.md +8 -0
  121. claude_mpm/commands/mpm-version.md +8 -0
  122. claude_mpm/commands/mpm.md +8 -0
  123. claude_mpm/config/agent_presets.py +8 -7
  124. claude_mpm/config/skill_sources.py +16 -0
  125. claude_mpm/core/claude_runner.py +143 -0
  126. claude_mpm/core/config.py +32 -19
  127. claude_mpm/core/logger.py +26 -9
  128. claude_mpm/core/logging_utils.py +35 -11
  129. claude_mpm/core/output_style_manager.py +49 -12
  130. claude_mpm/core/unified_config.py +10 -6
  131. claude_mpm/core/unified_paths.py +68 -80
  132. claude_mpm/experimental/cli_enhancements.py +2 -1
  133. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-312.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  136. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-312.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-314.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-312.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-314.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-312.pyc +0 -0
  143. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-314.pyc +0 -0
  144. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  145. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-314.pyc +0 -0
  146. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-312.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-314.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-312.pyc +0 -0
  151. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-314.pyc +0 -0
  152. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-312.pyc +0 -0
  153. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-314.pyc +0 -0
  154. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +29 -30
  155. claude_mpm/hooks/claude_hooks/event_handlers.py +112 -99
  156. claude_mpm/hooks/claude_hooks/hook_handler.py +81 -88
  157. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  158. claude_mpm/hooks/claude_hooks/installer.py +116 -8
  159. claude_mpm/hooks/claude_hooks/memory_integration.py +51 -31
  160. claude_mpm/hooks/claude_hooks/response_tracking.py +39 -58
  161. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-312.pyc +0 -0
  162. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-314.pyc +0 -0
  163. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  164. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  165. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-312.pyc +0 -0
  166. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-314.pyc +0 -0
  167. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-312.pyc +0 -0
  168. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-314.pyc +0 -0
  169. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  170. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-312.pyc +0 -0
  171. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-314.pyc +0 -0
  172. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  173. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-312.pyc +0 -0
  174. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-314.pyc +0 -0
  175. claude_mpm/hooks/claude_hooks/services/connection_manager.py +23 -28
  176. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
  177. claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
  178. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +47 -73
  179. claude_mpm/hooks/session_resume_hook.py +22 -18
  180. claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
  181. claude_mpm/scripts/claude-hook-handler.sh +43 -16
  182. claude_mpm/scripts/start_activity_logging.py +0 -0
  183. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  184. claude_mpm/services/agents/agent_selection_service.py +2 -2
  185. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  186. claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
  187. claude_mpm/services/event_log.py +8 -0
  188. claude_mpm/services/pm_skills_deployer.py +84 -6
  189. claude_mpm/services/skills/git_skill_source_manager.py +130 -10
  190. claude_mpm/services/skills/selective_skill_deployer.py +28 -0
  191. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  192. claude_mpm/services/skills_deployer.py +31 -5
  193. claude_mpm/skills/__init__.py +2 -1
  194. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  195. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  196. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  197. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  198. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  199. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  200. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  201. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  202. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  203. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  204. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  205. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  206. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  207. claude_mpm/skills/registry.py +295 -90
  208. {claude_mpm-5.4.96.dist-info → claude_mpm-5.6.17.dist-info}/METADATA +22 -6
  209. {claude_mpm-5.4.96.dist-info → claude_mpm-5.6.17.dist-info}/RECORD +213 -83
  210. {claude_mpm-5.4.96.dist-info → claude_mpm-5.6.17.dist-info}/WHEEL +0 -0
  211. {claude_mpm-5.4.96.dist-info → claude_mpm-5.6.17.dist-info}/entry_points.txt +0 -0
  212. {claude_mpm-5.4.96.dist-info → claude_mpm-5.6.17.dist-info}/licenses/LICENSE +0 -0
  213. {claude_mpm-5.4.96.dist-info → claude_mpm-5.6.17.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  214. {claude_mpm-5.4.96.dist-info → claude_mpm-5.6.17.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,146 @@
1
+ """Basic notification delivery for events.
2
+
3
+ This module provides Notifier which sends notifications for events.
4
+ Currently supports logging, with extensibility for future channels
5
+ (Slack, email, webhooks).
6
+ """
7
+
8
+ import logging
9
+ from dataclasses import dataclass
10
+
11
+ from ..models.events import Event
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ @dataclass
17
+ class NotifierConfig:
18
+ """Configuration for notifier.
19
+
20
+ Attributes:
21
+ log_level: Logging level for notifications (default: INFO)
22
+
23
+ Future attributes:
24
+ slack_webhook: URL for Slack webhook notifications
25
+ email_config: SMTP configuration for email notifications
26
+ webhook_urls: List of webhook URLs for custom integrations
27
+ """
28
+
29
+ log_level: str = "INFO"
30
+ # Future: slack_webhook, email_config, webhook_urls
31
+
32
+
33
+ class Notifier:
34
+ """Sends notifications for events.
35
+
36
+ Currently implements logging-based notifications with configurable
37
+ log levels. Designed for extensibility to support future notification
38
+ channels like Slack, email, and webhooks.
39
+
40
+ Attributes:
41
+ config: Notifier configuration
42
+
43
+ Example:
44
+ >>> config = NotifierConfig(log_level="INFO")
45
+ >>> notifier = Notifier(config)
46
+ >>> await notifier.notify(event)
47
+ >>> await notifier.notify_resolution(event, "User responded")
48
+ """
49
+
50
+ def __init__(self, config: NotifierConfig | None = None) -> None:
51
+ """Initialize notifier.
52
+
53
+ Args:
54
+ config: Optional NotifierConfig (uses defaults if not provided)
55
+ """
56
+ self.config = config or NotifierConfig()
57
+
58
+ # Map log level string to logging level
59
+ level_map = {
60
+ "DEBUG": logging.DEBUG,
61
+ "INFO": logging.INFO,
62
+ "WARNING": logging.WARNING,
63
+ "ERROR": logging.ERROR,
64
+ "CRITICAL": logging.CRITICAL,
65
+ }
66
+ self._log_level = level_map.get(self.config.log_level.upper(), logging.INFO)
67
+
68
+ logger.debug("Notifier initialized with log level: %s", self.config.log_level)
69
+
70
+ async def notify(self, event: Event) -> None:
71
+ """Send notification for an event.
72
+
73
+ Currently logs the event at the configured log level. Future versions
74
+ will support additional notification channels.
75
+
76
+ Args:
77
+ event: Event to notify about
78
+
79
+ Example:
80
+ >>> await notifier.notify(event)
81
+ # Logs: [HIGH] Event evt_123: Choose deployment target
82
+ """
83
+ # Format notification message
84
+ message = self._format_event(event)
85
+
86
+ # Log notification
87
+ logger.log(
88
+ self._log_level,
89
+ "Event notification: %s",
90
+ message,
91
+ )
92
+
93
+ # Future: Send to Slack, email, webhooks
94
+ # if self.config.slack_webhook:
95
+ # await self._send_slack(event)
96
+ # if self.config.email_config:
97
+ # await self._send_email(event)
98
+
99
+ async def notify_resolution(self, event: Event, response: str) -> None:
100
+ """Notify that an event was resolved.
101
+
102
+ Logs the resolution with the user's response. Future versions will
103
+ send resolution notifications to configured channels.
104
+
105
+ Args:
106
+ event: Event that was resolved
107
+ response: User's response to the event
108
+
109
+ Example:
110
+ >>> await notifier.notify_resolution(event, "Deploy to staging")
111
+ # Logs: Event evt_123 resolved: Deploy to staging
112
+ """
113
+ message = f"Event {event.id} resolved: {response[:100]}"
114
+
115
+ logger.log(
116
+ self._log_level,
117
+ "Event resolution: %s",
118
+ message,
119
+ )
120
+
121
+ # Future: Send resolution notifications to channels
122
+
123
+ def _format_event(self, event: Event) -> str:
124
+ """Format event for notification display.
125
+
126
+ Args:
127
+ event: Event to format
128
+
129
+ Returns:
130
+ Formatted notification string
131
+
132
+ Example:
133
+ >>> msg = notifier._format_event(event)
134
+ '[HIGH] evt_123 (proj_456): Choose deployment target'
135
+ """
136
+ parts = [
137
+ f"[{event.priority.value.upper()}]",
138
+ f"{event.id}",
139
+ f"({event.project_id})",
140
+ f"{event.title}",
141
+ ]
142
+
143
+ if event.options:
144
+ parts.append(f"Options: {', '.join(event.options)}")
145
+
146
+ return " ".join(parts)
@@ -5,7 +5,15 @@ aliases: [mpm-config]
5
5
  migration_target: /mpm/config
6
6
  category: config
7
7
  description: Manage Claude MPM configuration
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-config"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-config` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-config` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-config
10
18
 
11
19
  Unified configuration management with auto-detection.
@@ -5,7 +5,15 @@ aliases: [mpm-doctor]
5
5
  migration_target: /mpm/system:doctor
6
6
  category: system
7
7
  description: Run diagnostic checks on Claude MPM installation
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-doctor"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-doctor` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-doctor` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-doctor
10
18
 
11
19
  Run comprehensive diagnostics on Claude MPM installation.
@@ -5,7 +5,15 @@ aliases: [mpm-help]
5
5
  migration_target: /mpm/system:help
6
6
  category: system
7
7
  description: Display help for Claude MPM commands
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-help"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-help` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-help` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-help
10
18
 
11
19
  Show help for MPM commands. Delegates to PM agent.
@@ -5,7 +5,15 @@ aliases: [mpm-init]
5
5
  migration_target: /mpm/system:init
6
6
  category: system
7
7
  description: Initialize or update project for Claude Code and MPM
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-init"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-init` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-init` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-init
10
18
 
11
19
  Initialize or intelligently update project for Claude Code and Claude MPM.
@@ -5,7 +5,15 @@ aliases: [mpm-monitor]
5
5
  migration_target: /mpm/system:monitor
6
6
  category: system
7
7
  description: Control monitoring server and dashboard
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-monitor"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-monitor` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-monitor` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-monitor
10
18
 
11
19
  Manage Socket.IO monitoring server for real-time dashboard.
@@ -5,7 +5,15 @@ aliases: [mpm-organize]
5
5
  migration_target: /mpm/system:organize
6
6
  category: system
7
7
  description: Organize project files with intelligent consolidation
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-organize"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-organize` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-organize` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-organize
10
18
 
11
19
  Organize ALL project files with intelligent detection, consolidation, and pruning.
@@ -5,7 +5,15 @@ aliases: [mpm-postmortem]
5
5
  migration_target: /mpm/analysis:postmortem
6
6
  category: analysis
7
7
  description: Analyze session errors and suggest improvements
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-postmortem"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-postmortem` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-postmortem` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-postmortem
10
18
 
11
19
  Analyze session errors and generate improvement suggestions.
@@ -5,7 +5,15 @@ aliases: [mpm-session-resume]
5
5
  migration_target: /mpm/session:resume
6
6
  category: session
7
7
  description: Load context from paused session
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-session-resume"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-session-resume` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-session-resume` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-session-resume
10
18
 
11
19
  Load and display context from most recent paused session.
@@ -5,7 +5,15 @@ aliases: [mpm-status]
5
5
  migration_target: /mpm/system:status
6
6
  category: system
7
7
  description: Display Claude MPM system status
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-status"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-status` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-status` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-status
10
18
 
11
19
  Show MPM system status. Delegates to PM agent.
@@ -5,7 +5,15 @@ aliases: [mpm-ticket-view]
5
5
  migration_target: /mpm/ticket:view
6
6
  category: tickets
7
7
  description: Orchestrate ticketing agent for project management workflows
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-ticket-view"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-ticket-view` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-ticket-view` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-ticket
10
18
 
11
19
  High-level ticketing workflows delegating to ticketing agent.
@@ -5,7 +5,15 @@ aliases: [mpm-version]
5
5
  migration_target: /mpm/system:version
6
6
  category: system
7
7
  description: Show version information
8
+ deprecated: true
9
+ deprecated_in: "5.5.0"
10
+ replacement: "skill:mpm-version"
8
11
  ---
12
+
13
+ > **Deprecated:** This command file is deprecated in favor of the `mpm-version` skill.
14
+ > For Claude Code 2.1.3+, use the skill-based `/mpm-version` command instead.
15
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
16
+
9
17
  # /mpm-version
10
18
 
11
19
  Display version information for MPM, agents, and skills.
@@ -6,7 +6,15 @@ migration_target: /mpm
6
6
  category: system
7
7
  deprecated_aliases: []
8
8
  description: Access Claude MPM functionality and manage multi-agent orchestration
9
+ deprecated: true
10
+ deprecated_in: "5.5.0"
11
+ replacement: "skill:mpm"
9
12
  ---
13
+
14
+ > **Deprecated:** This command file is deprecated in favor of the `mpm` skill.
15
+ > For Claude Code 2.1.3+, use the skill-based `/mpm` command instead.
16
+ > This file is kept for backward compatibility with Claude Code < 2.1.3.
17
+
10
18
  # Claude MPM - Multi-Agent Project Manager
11
19
 
12
20
  Access Claude MPM functionality and manage your multi-agent orchestration.
@@ -25,12 +25,17 @@ from typing import Any, Callable, Dict, List, Union
25
25
  PresetResolver = Union[List[str], Callable[[], List[str]]]
26
26
 
27
27
  # Core agents included in ALL presets (MIN and MAX)
28
+ # Standard 9 core agents for essential PM workflow functionality
28
29
  CORE_AGENTS = [
29
30
  "claude-mpm/mpm-agent-manager", # Agent lifecycle management
30
31
  "claude-mpm/mpm-skills-manager", # Skills management
31
- "universal/research", # Codebase investigation
32
+ "engineer/core/engineer", # General-purpose implementation
33
+ "universal/research", # Codebase exploration and analysis
34
+ "qa/qa", # Testing and quality assurance
35
+ "qa/web-qa", # Browser-based testing specialist
32
36
  "documentation/documentation", # Documentation generation
33
- "engineer/core/engineer", # General-purpose engineering
37
+ "ops/core/ops", # Basic deployment operations
38
+ "documentation/ticketing", # Ticket tracking (essential for PM workflow)
34
39
  ]
35
40
 
36
41
  PRESETS: Dict[str, Dict[str, Any]] = {
@@ -39,11 +44,7 @@ PRESETS: Dict[str, Dict[str, Any]] = {
39
44
  # ========================================
40
45
  "minimal": {
41
46
  "description": "Core agents only - universal starter kit",
42
- "agents": CORE_AGENTS
43
- + [
44
- "qa/qa",
45
- "ops/core/ops",
46
- ],
47
+ "agents": CORE_AGENTS, # All 8 core agents (no additional needed)
47
48
  "use_cases": ["Any project type", "Quick start", "Learning"],
48
49
  },
49
50
  # ========================================
@@ -54,6 +54,7 @@ class SkillSource:
54
54
  branch: Git branch to use (default: "main")
55
55
  priority: Priority for skill resolution (lower = higher precedence)
56
56
  enabled: Whether this source should be synced
57
+ token: Optional GitHub token or env var reference (e.g., "$MY_TOKEN")
57
58
 
58
59
  Priority System:
59
60
  - 0: Reserved for system repository (highest precedence)
@@ -61,6 +62,12 @@ class SkillSource:
61
62
  - 100-999: Normal priority custom sources
62
63
  - 1000+: Low priority custom sources
63
64
 
65
+ Token Authentication:
66
+ - Direct token: "ghp_xxxxx" (stored in config, not recommended)
67
+ - Env var reference: "$PRIVATE_REPO_TOKEN" (resolved at runtime)
68
+ - If None, falls back to GITHUB_TOKEN or GH_TOKEN env vars
69
+ - Priority: source.token > GITHUB_TOKEN > GH_TOKEN
70
+
64
71
  Example:
65
72
  >>> source = SkillSource(
66
73
  ... id="system",
@@ -70,6 +77,12 @@ class SkillSource:
70
77
  ... )
71
78
  >>> source.validate()
72
79
  []
80
+ >>> private_source = SkillSource(
81
+ ... id="private",
82
+ ... type="git",
83
+ ... url="https://github.com/myorg/private-skills",
84
+ ... token="$PRIVATE_REPO_TOKEN"
85
+ ... )
73
86
  """
74
87
 
75
88
  id: str
@@ -78,6 +91,7 @@ class SkillSource:
78
91
  branch: str = "main"
79
92
  priority: int = 100
80
93
  enabled: bool = True
94
+ token: Optional[str] = None
81
95
 
82
96
  def __post_init__(self):
83
97
  """Validate skill source configuration after initialization.
@@ -262,6 +276,7 @@ class SkillSourceConfiguration:
262
276
  branch=source_data.get("branch", "main"),
263
277
  priority=source_data.get("priority", 100),
264
278
  enabled=source_data.get("enabled", True),
279
+ token=source_data.get("token"),
265
280
  )
266
281
  sources.append(source)
267
282
  except (KeyError, ValueError) as e:
@@ -326,6 +341,7 @@ class SkillSourceConfiguration:
326
341
  "branch": source.branch,
327
342
  "priority": source.priority,
328
343
  "enabled": source.enabled,
344
+ **({"token": source.token} if source.token else {}),
329
345
  }
330
346
  for source in sources
331
347
  ]
@@ -1,5 +1,7 @@
1
1
  """Claude runner with both exec and subprocess launch methods."""
2
2
 
3
+ import hashlib
4
+ import json
3
5
  import os
4
6
  from pathlib import Path
5
7
  from typing import Optional
@@ -211,9 +213,137 @@ class ClaudeRunner:
211
213
  }
212
214
  )
213
215
 
216
+ def _get_deployment_state_path(self) -> Path:
217
+ """Get path to deployment state file."""
218
+ return Path.cwd() / ".claude-mpm" / "deployment-state.json"
219
+
220
+ def _calculate_deployment_hash(self, agents_dir: Path) -> str:
221
+ """Calculate hash of all agent files for change detection.
222
+
223
+ Args:
224
+ agents_dir: Directory containing agent .md files
225
+
226
+ Returns:
227
+ SHA256 hash of agent file contents
228
+ """
229
+ if not agents_dir.exists():
230
+ return ""
231
+
232
+ # Get all .md files sorted for consistent hashing
233
+ agent_files = sorted(agents_dir.glob("*.md"))
234
+
235
+ hash_obj = hashlib.sha256()
236
+ for agent_file in agent_files:
237
+ # Include filename and content in hash
238
+ hash_obj.update(agent_file.name.encode())
239
+ try:
240
+ hash_obj.update(agent_file.read_bytes())
241
+ except Exception as e:
242
+ self.logger.debug(f"Error reading {agent_file} for hash: {e}")
243
+
244
+ return hash_obj.hexdigest()
245
+
246
+ def _check_deployment_state(self) -> bool:
247
+ """Check if agents are already deployed and up-to-date.
248
+
249
+ Returns:
250
+ True if agents are already deployed and match current version, False otherwise
251
+ """
252
+ state_file = self._get_deployment_state_path()
253
+ agents_dir = Path.cwd() / ".claude" / "agents"
254
+
255
+ # If state file doesn't exist, need to deploy
256
+ if not state_file.exists():
257
+ return False
258
+
259
+ # If agents directory doesn't exist, need to deploy
260
+ if not agents_dir.exists():
261
+ return False
262
+
263
+ try:
264
+ # Load deployment state
265
+ state_data = json.loads(state_file.read_text())
266
+
267
+ # Get current version from package
268
+ from claude_mpm import __version__
269
+
270
+ # Check if version matches
271
+ if state_data.get("version") != __version__:
272
+ self.logger.debug(
273
+ f"Version mismatch: {state_data.get('version')} != {__version__}"
274
+ )
275
+ return False
276
+
277
+ # Check if agent count and hash match
278
+ current_hash = self._calculate_deployment_hash(agents_dir)
279
+ stored_hash = state_data.get("deployment_hash", "")
280
+
281
+ if current_hash != stored_hash:
282
+ self.logger.debug("Agent deployment hash mismatch")
283
+ return False
284
+
285
+ # All checks passed - agents are already deployed
286
+ agent_count = state_data.get("agent_count", 0)
287
+ self.logger.debug(
288
+ f"Agents already deployed: {agent_count} agents (v{__version__})"
289
+ )
290
+ return True
291
+
292
+ except Exception as e:
293
+ self.logger.debug(f"Error checking deployment state: {e}")
294
+ return False
295
+
296
+ def _save_deployment_state(self, agent_count: int) -> None:
297
+ """Save current deployment state.
298
+
299
+ Args:
300
+ agent_count: Number of agents deployed
301
+ """
302
+ state_file = self._get_deployment_state_path()
303
+ agents_dir = Path.cwd() / ".claude" / "agents"
304
+
305
+ try:
306
+ import time
307
+
308
+ from claude_mpm import __version__
309
+
310
+ # Calculate deployment hash
311
+ deployment_hash = self._calculate_deployment_hash(agents_dir)
312
+
313
+ # Create state data
314
+ state_data = {
315
+ "version": __version__,
316
+ "agent_count": agent_count,
317
+ "deployment_hash": deployment_hash,
318
+ "deployed_at": time.time(),
319
+ }
320
+
321
+ # Ensure directory exists
322
+ state_file.parent.mkdir(parents=True, exist_ok=True)
323
+
324
+ # Write state file
325
+ state_file.write_text(json.dumps(state_data, indent=2))
326
+ self.logger.debug(f"Saved deployment state: {agent_count} agents")
327
+
328
+ except Exception as e:
329
+ self.logger.debug(f"Error saving deployment state: {e}")
330
+
214
331
  def setup_agents(self) -> bool:
215
332
  """Deploy native agents to .claude/agents/."""
216
333
  try:
334
+ # Check if agents are already deployed and up-to-date
335
+ if self._check_deployment_state():
336
+ agents_dir = Path.cwd() / ".claude" / "agents"
337
+ agent_count = len(list(agents_dir.glob("*.md")))
338
+ print(f"✓ Agents: {agent_count} cached")
339
+ if self.project_logger:
340
+ self.project_logger.log_system(
341
+ f"Agents already deployed: {agent_count} cached",
342
+ level="INFO",
343
+ component="deployment",
344
+ )
345
+ return True
346
+
217
347
  if self.project_logger:
218
348
  self.project_logger.log_system(
219
349
  "Starting agent deployment", level="INFO", component="deployment"
@@ -239,6 +369,12 @@ class ClaudeRunner:
239
369
 
240
370
  # Set Claude environment
241
371
  self.deployment_service.set_claude_environment()
372
+
373
+ # Save deployment state for future runs
374
+ agents_dir = Path.cwd() / ".claude" / "agents"
375
+ total_agents = len(list(agents_dir.glob("*.md")))
376
+ self._save_deployment_state(total_agents)
377
+
242
378
  return True
243
379
  self.logger.info("All agents already up to date")
244
380
  if self.project_logger:
@@ -247,6 +383,13 @@ class ClaudeRunner:
247
383
  level="INFO",
248
384
  component="deployment",
249
385
  )
386
+
387
+ # Save deployment state even if no changes
388
+ agents_dir = Path.cwd() / ".claude" / "agents"
389
+ if agents_dir.exists():
390
+ total_agents = len(list(agents_dir.glob("*.md")))
391
+ self._save_deployment_state(total_agents)
392
+
250
393
  return True
251
394
 
252
395
  except PermissionError as e: