claude-mpm 5.6.1__py3-none-any.whl → 5.6.76__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/PM_INSTRUCTIONS.md +8 -3
  3. claude_mpm/auth/__init__.py +35 -0
  4. claude_mpm/auth/callback_server.py +328 -0
  5. claude_mpm/auth/models.py +104 -0
  6. claude_mpm/auth/oauth_manager.py +266 -0
  7. claude_mpm/auth/providers/__init__.py +12 -0
  8. claude_mpm/auth/providers/base.py +165 -0
  9. claude_mpm/auth/providers/google.py +261 -0
  10. claude_mpm/auth/token_storage.py +252 -0
  11. claude_mpm/cli/commands/commander.py +174 -4
  12. claude_mpm/cli/commands/mcp.py +29 -17
  13. claude_mpm/cli/commands/mcp_command_router.py +39 -0
  14. claude_mpm/cli/commands/mcp_service_commands.py +304 -0
  15. claude_mpm/cli/commands/oauth.py +481 -0
  16. claude_mpm/cli/commands/skill_source.py +51 -2
  17. claude_mpm/cli/commands/skills.py +5 -3
  18. claude_mpm/cli/executor.py +9 -0
  19. claude_mpm/cli/helpers.py +1 -1
  20. claude_mpm/cli/parsers/base_parser.py +13 -0
  21. claude_mpm/cli/parsers/commander_parser.py +43 -10
  22. claude_mpm/cli/parsers/mcp_parser.py +79 -0
  23. claude_mpm/cli/parsers/oauth_parser.py +165 -0
  24. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  25. claude_mpm/cli/parsers/skills_parser.py +5 -0
  26. claude_mpm/cli/startup.py +300 -33
  27. claude_mpm/cli/startup_display.py +4 -2
  28. claude_mpm/cli/startup_migrations.py +236 -0
  29. claude_mpm/commander/__init__.py +6 -0
  30. claude_mpm/commander/adapters/__init__.py +32 -3
  31. claude_mpm/commander/adapters/auggie.py +260 -0
  32. claude_mpm/commander/adapters/base.py +98 -1
  33. claude_mpm/commander/adapters/claude_code.py +32 -1
  34. claude_mpm/commander/adapters/codex.py +237 -0
  35. claude_mpm/commander/adapters/example_usage.py +310 -0
  36. claude_mpm/commander/adapters/mpm.py +389 -0
  37. claude_mpm/commander/adapters/registry.py +204 -0
  38. claude_mpm/commander/api/app.py +32 -16
  39. claude_mpm/commander/api/errors.py +21 -0
  40. claude_mpm/commander/api/routes/messages.py +11 -11
  41. claude_mpm/commander/api/routes/projects.py +20 -20
  42. claude_mpm/commander/api/routes/sessions.py +37 -26
  43. claude_mpm/commander/api/routes/work.py +86 -50
  44. claude_mpm/commander/api/schemas.py +4 -0
  45. claude_mpm/commander/chat/cli.py +47 -5
  46. claude_mpm/commander/chat/commands.py +44 -16
  47. claude_mpm/commander/chat/repl.py +1729 -82
  48. claude_mpm/commander/config.py +5 -3
  49. claude_mpm/commander/core/__init__.py +10 -0
  50. claude_mpm/commander/core/block_manager.py +325 -0
  51. claude_mpm/commander/core/response_manager.py +323 -0
  52. claude_mpm/commander/daemon.py +215 -10
  53. claude_mpm/commander/env_loader.py +59 -0
  54. claude_mpm/commander/events/manager.py +61 -1
  55. claude_mpm/commander/frameworks/base.py +91 -1
  56. claude_mpm/commander/frameworks/mpm.py +9 -14
  57. claude_mpm/commander/git/__init__.py +5 -0
  58. claude_mpm/commander/git/worktree_manager.py +212 -0
  59. claude_mpm/commander/instance_manager.py +546 -15
  60. claude_mpm/commander/memory/__init__.py +45 -0
  61. claude_mpm/commander/memory/compression.py +347 -0
  62. claude_mpm/commander/memory/embeddings.py +230 -0
  63. claude_mpm/commander/memory/entities.py +310 -0
  64. claude_mpm/commander/memory/example_usage.py +290 -0
  65. claude_mpm/commander/memory/integration.py +325 -0
  66. claude_mpm/commander/memory/search.py +381 -0
  67. claude_mpm/commander/memory/store.py +657 -0
  68. claude_mpm/commander/models/events.py +6 -0
  69. claude_mpm/commander/persistence/state_store.py +95 -1
  70. claude_mpm/commander/registry.py +10 -4
  71. claude_mpm/commander/runtime/monitor.py +32 -2
  72. claude_mpm/commander/tmux_orchestrator.py +3 -2
  73. claude_mpm/commander/work/executor.py +38 -20
  74. claude_mpm/commander/workflow/event_handler.py +25 -3
  75. claude_mpm/config/skill_sources.py +16 -0
  76. claude_mpm/constants.py +5 -0
  77. claude_mpm/core/claude_runner.py +152 -0
  78. claude_mpm/core/config.py +30 -22
  79. claude_mpm/core/config_constants.py +74 -9
  80. claude_mpm/core/constants.py +56 -12
  81. claude_mpm/core/hook_manager.py +2 -1
  82. claude_mpm/core/interactive_session.py +5 -4
  83. claude_mpm/core/logger.py +16 -2
  84. claude_mpm/core/logging_utils.py +40 -16
  85. claude_mpm/core/network_config.py +148 -0
  86. claude_mpm/core/oneshot_session.py +7 -6
  87. claude_mpm/core/output_style_manager.py +37 -7
  88. claude_mpm/core/socketio_pool.py +47 -15
  89. claude_mpm/core/unified_paths.py +68 -80
  90. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +30 -31
  91. claude_mpm/hooks/claude_hooks/event_handlers.py +285 -194
  92. claude_mpm/hooks/claude_hooks/hook_handler.py +115 -32
  93. claude_mpm/hooks/claude_hooks/installer.py +222 -54
  94. claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
  95. claude_mpm/hooks/claude_hooks/response_tracking.py +40 -59
  96. claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
  97. claude_mpm/hooks/claude_hooks/services/connection_manager.py +25 -30
  98. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +24 -28
  99. claude_mpm/hooks/claude_hooks/services/container.py +326 -0
  100. claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
  101. claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
  102. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +49 -75
  103. claude_mpm/hooks/session_resume_hook.py +22 -18
  104. claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
  105. claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
  106. claude_mpm/init.py +21 -14
  107. claude_mpm/mcp/__init__.py +9 -0
  108. claude_mpm/mcp/google_workspace_server.py +610 -0
  109. claude_mpm/scripts/claude-hook-handler.sh +10 -9
  110. claude_mpm/services/agents/agent_selection_service.py +2 -2
  111. claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
  112. claude_mpm/services/command_deployment_service.py +44 -26
  113. claude_mpm/services/hook_installer_service.py +77 -8
  114. claude_mpm/services/mcp_config_manager.py +99 -19
  115. claude_mpm/services/mcp_service_registry.py +294 -0
  116. claude_mpm/services/monitor/server.py +6 -1
  117. claude_mpm/services/pm_skills_deployer.py +5 -3
  118. claude_mpm/services/skills/git_skill_source_manager.py +79 -8
  119. claude_mpm/services/skills/selective_skill_deployer.py +28 -0
  120. claude_mpm/services/skills/skill_discovery_service.py +17 -1
  121. claude_mpm/services/skills_deployer.py +31 -5
  122. claude_mpm/skills/__init__.py +2 -1
  123. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  124. claude_mpm/skills/registry.py +295 -90
  125. {claude_mpm-5.6.1.dist-info → claude_mpm-5.6.76.dist-info}/METADATA +28 -3
  126. {claude_mpm-5.6.1.dist-info → claude_mpm-5.6.76.dist-info}/RECORD +131 -93
  127. {claude_mpm-5.6.1.dist-info → claude_mpm-5.6.76.dist-info}/WHEEL +1 -1
  128. {claude_mpm-5.6.1.dist-info → claude_mpm-5.6.76.dist-info}/entry_points.txt +2 -0
  129. {claude_mpm-5.6.1.dist-info → claude_mpm-5.6.76.dist-info}/licenses/LICENSE +0 -0
  130. {claude_mpm-5.6.1.dist-info → claude_mpm-5.6.76.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  131. {claude_mpm-5.6.1.dist-info → claude_mpm-5.6.76.dist-info}/top_level.txt +0 -0
@@ -23,17 +23,21 @@ def add_commander_subparser(subparsers: argparse._SubParsersAction) -> None:
23
23
  """
24
24
  commander_parser = subparsers.add_parser(
25
25
  "commander",
26
- help="Interactive Commander mode for managing multiple Claude instances",
26
+ help="Launch Commander multi-project orchestration (ALPHA)",
27
27
  description="""
28
- Commander Mode - Interactive Instance Management
28
+ Commander Mode - Multi-Project Orchestration (ALPHA)
29
29
 
30
- Commander provides an interactive REPL interface for:
31
- - Starting and stopping Claude Code/MPM instances in tmux
32
- - Connecting to instances and sending natural language commands
33
- - Managing multiple concurrent projects
34
- - Viewing instance status and output
30
+ The commander subcommand auto-starts the Commander daemon (if not already running)
31
+ and launches an interactive REPL for managing multiple Claude Code instances.
35
32
 
36
- Commands:
33
+ Commander provides:
34
+ - Auto-starting daemon that manages project lifecycles
35
+ - Interactive REPL for controlling instances
36
+ - Tmux-based session management
37
+ - Real-time output monitoring
38
+ - REST API for external control (http://127.0.0.1:8765)
39
+
40
+ REPL Commands:
37
41
  list, ls, instances List active instances
38
42
  start <path> Start new instance at path
39
43
  --framework <cc|mpm> Specify framework (default: cc)
@@ -50,7 +54,16 @@ Natural Language:
50
54
  command will be sent to the connected instance as a message.
51
55
 
52
56
  Examples:
57
+ # Start daemon and launch interactive chat
53
58
  claude-mpm commander
59
+
60
+ # Start daemon only (no chat interface)
61
+ claude-mpm commander --daemon-only
62
+
63
+ # Use custom port
64
+ claude-mpm commander --port 9000
65
+
66
+ # In REPL:
54
67
  > start ~/myproject --framework cc --name myapp
55
68
  > connect myapp
56
69
  > Fix the authentication bug in login.py
@@ -64,8 +77,8 @@ Examples:
64
77
  commander_parser.add_argument(
65
78
  "--port",
66
79
  type=int,
67
- default=8765,
68
- help="Port for internal services (default: 8765)",
80
+ default=8766, # NetworkPorts.COMMANDER_DEFAULT
81
+ help="Port for internal services (default: 8766)",
69
82
  )
70
83
 
71
84
  # Optional: State directory
@@ -81,3 +94,23 @@ Examples:
81
94
  action="store_true",
82
95
  help="Enable debug logging",
83
96
  )
97
+
98
+ # Daemon auto-start options
99
+ commander_parser.add_argument(
100
+ "--host",
101
+ type=str,
102
+ default="127.0.0.1",
103
+ help="Daemon host (default: 127.0.0.1)",
104
+ )
105
+
106
+ commander_parser.add_argument(
107
+ "--no-chat",
108
+ action="store_true",
109
+ help="Start daemon only without interactive chat",
110
+ )
111
+
112
+ commander_parser.add_argument(
113
+ "--daemon-only",
114
+ action="store_true",
115
+ help="Alias for --no-chat (start daemon only)",
116
+ )
@@ -192,4 +192,83 @@ def add_mcp_subparser(subparsers) -> argparse.ArgumentParser:
192
192
  "--force", action="store_true", help="Force overwrite existing configuration"
193
193
  )
194
194
 
195
+ # =========================================================================
196
+ # Service Management Commands (enable/disable/list)
197
+ # =========================================================================
198
+
199
+ # Enable MCP service
200
+ enable_parser = mcp_subparsers.add_parser(
201
+ MCPCommands.ENABLE.value,
202
+ help="Enable an MCP service in configuration",
203
+ )
204
+ enable_parser.add_argument(
205
+ "service_name",
206
+ help="Name of the MCP service to enable (e.g., kuzu-memory, mcp-github)",
207
+ )
208
+ enable_parser.add_argument(
209
+ "--interactive",
210
+ "-i",
211
+ action="store_true",
212
+ help="Prompt for required credentials interactively",
213
+ )
214
+ enable_parser.add_argument(
215
+ "--env",
216
+ "-e",
217
+ action="append",
218
+ metavar="KEY=VALUE",
219
+ help="Set environment variable (can be used multiple times)",
220
+ )
221
+ enable_parser.add_argument(
222
+ "--global",
223
+ dest="use_global",
224
+ action="store_true",
225
+ help="Enable in global ~/.claude.json instead of project .mcp.json",
226
+ )
227
+
228
+ # Disable MCP service
229
+ disable_parser = mcp_subparsers.add_parser(
230
+ MCPCommands.DISABLE.value,
231
+ help="Disable an MCP service from configuration",
232
+ )
233
+ disable_parser.add_argument(
234
+ "service_name",
235
+ help="Name of the MCP service to disable",
236
+ )
237
+ disable_parser.add_argument(
238
+ "--global",
239
+ dest="use_global",
240
+ action="store_true",
241
+ help="Disable in global ~/.claude.json instead of project .mcp.json",
242
+ )
243
+
244
+ # List MCP services
245
+ list_parser = mcp_subparsers.add_parser(
246
+ MCPCommands.LIST.value,
247
+ help="List MCP services (available and enabled)",
248
+ )
249
+ list_parser.add_argument(
250
+ "--available",
251
+ "-a",
252
+ action="store_true",
253
+ help="Show all available services from registry",
254
+ )
255
+ list_parser.add_argument(
256
+ "--enabled",
257
+ "-e",
258
+ action="store_true",
259
+ help="Show only enabled services",
260
+ )
261
+ list_parser.add_argument(
262
+ "--global",
263
+ dest="use_global",
264
+ action="store_true",
265
+ help="Check global ~/.claude.json instead of project .mcp.json",
266
+ )
267
+ list_parser.add_argument(
268
+ "--verbose",
269
+ "-v",
270
+ action="store_true",
271
+ help="Show detailed service information",
272
+ )
273
+
195
274
  return mcp_parser
@@ -0,0 +1,165 @@
1
+ """
2
+ OAuth command parser for claude-mpm CLI.
3
+
4
+ WHY: This module provides the oauth command with subcommands for
5
+ managing OAuth authentication for MCP services that require OAuth2 flows.
6
+
7
+ DESIGN DECISION: 'oauth' provides comprehensive OAuth management including
8
+ listing OAuth-capable services, setup, status, token revocation, and refresh.
9
+ """
10
+
11
+ import argparse
12
+
13
+ from .base_parser import add_common_arguments
14
+
15
+
16
+ def add_oauth_subparser(subparsers) -> argparse.ArgumentParser:
17
+ """
18
+ Add the oauth subparser with all OAuth management subcommands.
19
+
20
+ WHY: 'oauth' provides comprehensive OAuth management for MCP services
21
+ that require OAuth2 authentication flows.
22
+
23
+ Args:
24
+ subparsers: The subparsers object from the main parser
25
+
26
+ Returns:
27
+ The configured oauth subparser
28
+ """
29
+ # OAuth command with subcommands
30
+ oauth_parser = subparsers.add_parser(
31
+ "oauth",
32
+ help="Manage OAuth authentication for MCP services",
33
+ description="""
34
+ Manage OAuth authentication for MCP services.
35
+
36
+ Available commands:
37
+ list List OAuth-capable MCP services
38
+ setup <service> Set up OAuth authentication for a service
39
+ status <service> Show OAuth token status for a service
40
+ revoke <service> Revoke OAuth tokens for a service
41
+ refresh <service> Refresh OAuth tokens for a service
42
+
43
+ Examples:
44
+ claude-mpm oauth list
45
+ claude-mpm oauth setup workspace-mcp
46
+ claude-mpm oauth status workspace-mcp
47
+ claude-mpm oauth revoke workspace-mcp
48
+ claude-mpm oauth refresh workspace-mcp
49
+ """,
50
+ formatter_class=argparse.RawDescriptionHelpFormatter,
51
+ )
52
+ add_common_arguments(oauth_parser)
53
+
54
+ # Add subcommands
55
+ oauth_subparsers = oauth_parser.add_subparsers(
56
+ dest="oauth_command", help="OAuth commands", metavar="SUBCOMMAND"
57
+ )
58
+
59
+ # List subcommand
60
+ list_parser = oauth_subparsers.add_parser(
61
+ "list",
62
+ help="List OAuth-capable MCP services",
63
+ description="List all MCP services that support OAuth authentication.",
64
+ )
65
+ add_common_arguments(list_parser)
66
+ list_parser.add_argument(
67
+ "--format",
68
+ choices=["table", "json"],
69
+ default="table",
70
+ help="Output format (default: table)",
71
+ )
72
+
73
+ # Setup subcommand
74
+ setup_parser = oauth_subparsers.add_parser(
75
+ "setup",
76
+ help="Set up OAuth authentication for a service",
77
+ description="""
78
+ Set up OAuth authentication for an MCP service.
79
+
80
+ This command initiates the OAuth2 flow by:
81
+ 1. Looking for credentials in .env.local, .env, or environment variables
82
+ 2. Prompting for credentials if not found
83
+ 3. Opening a browser for user authentication
84
+ 4. Starting a local callback server to receive the OAuth redirect
85
+ 5. Storing the tokens securely for future use
86
+
87
+ Required environment variables (checked in order):
88
+ 1. .env.local file (highest priority)
89
+ 2. .env file
90
+ 3. Environment variables
91
+
92
+ For Google OAuth services:
93
+ GOOGLE_OAUTH_CLIENT_ID - Your OAuth client ID
94
+ GOOGLE_OAUTH_CLIENT_SECRET - Your OAuth client secret
95
+
96
+ Get credentials from: https://console.cloud.google.com/apis/credentials
97
+ """,
98
+ formatter_class=argparse.RawDescriptionHelpFormatter,
99
+ )
100
+ add_common_arguments(setup_parser)
101
+ setup_parser.add_argument(
102
+ "service_name",
103
+ help="Name of the MCP service to authenticate (e.g., workspace-mcp)",
104
+ )
105
+ setup_parser.add_argument(
106
+ "--no-browser",
107
+ action="store_true",
108
+ help="Don't open browser automatically, just print the URL",
109
+ )
110
+ setup_parser.add_argument(
111
+ "--port",
112
+ type=int,
113
+ default=8085,
114
+ help="Port for the OAuth callback server (default: 8085)",
115
+ )
116
+
117
+ # Status subcommand
118
+ status_parser = oauth_subparsers.add_parser(
119
+ "status",
120
+ help="Show OAuth token status for a service",
121
+ description="Display the current OAuth token status including validity and expiration.",
122
+ )
123
+ add_common_arguments(status_parser)
124
+ status_parser.add_argument(
125
+ "service_name",
126
+ help="Name of the MCP service to check",
127
+ )
128
+ status_parser.add_argument(
129
+ "--format",
130
+ choices=["table", "json"],
131
+ default="table",
132
+ help="Output format (default: table)",
133
+ )
134
+
135
+ # Revoke subcommand
136
+ revoke_parser = oauth_subparsers.add_parser(
137
+ "revoke",
138
+ help="Revoke OAuth tokens for a service",
139
+ description="Revoke and delete stored OAuth tokens for a service.",
140
+ )
141
+ add_common_arguments(revoke_parser)
142
+ revoke_parser.add_argument(
143
+ "service_name",
144
+ help="Name of the MCP service to revoke tokens for",
145
+ )
146
+ revoke_parser.add_argument(
147
+ "-y",
148
+ "--yes",
149
+ action="store_true",
150
+ help="Skip confirmation prompt",
151
+ )
152
+
153
+ # Refresh subcommand
154
+ refresh_parser = oauth_subparsers.add_parser(
155
+ "refresh",
156
+ help="Refresh OAuth tokens for a service",
157
+ description="Refresh the OAuth tokens using the stored refresh token.",
158
+ )
159
+ add_common_arguments(refresh_parser)
160
+ refresh_parser.add_argument(
161
+ "service_name",
162
+ help="Name of the MCP service to refresh tokens for",
163
+ )
164
+
165
+ return oauth_parser
@@ -76,6 +76,10 @@ def add_skill_source_subparser(subparsers) -> argparse.ArgumentParser:
76
76
  dest="skip_test",
77
77
  help="Skip immediate testing (not recommended)",
78
78
  )
79
+ add_parser.add_argument(
80
+ "--token",
81
+ help="GitHub token or env var reference (e.g., ghp_xxx or $PRIVATE_TOKEN)",
82
+ )
79
83
 
80
84
  # Remove repository
81
85
  remove_parser = skill_source_subparsers.add_parser(
@@ -167,6 +167,11 @@ def add_skills_subparser(subparsers) -> argparse.ArgumentParser:
167
167
  action="store_true",
168
168
  help="Force redeployment of already deployed skills",
169
169
  )
170
+ deploy_github_parser.add_argument(
171
+ "--all",
172
+ action="store_true",
173
+ help="Deploy all available skills, not just agent-referenced ones",
174
+ )
170
175
 
171
176
  # List available GitHub skills
172
177
  list_available_parser = skills_subparsers.add_parser(