claude-mpm 5.4.103__py3-none-any.whl → 5.4.105__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.
claude_mpm/VERSION CHANGED
@@ -1 +1 @@
1
- 5.4.103
1
+ 5.4.105
@@ -206,27 +206,33 @@ def execute_command(command: str, args) -> int:
206
206
  "status": show_status,
207
207
  }
208
208
 
209
- # Get handler and invoke
209
+ # Get handler and call it with argument list (same pattern as autotodos)
210
210
  handler = handlers.get(subcommand)
211
211
  if handler:
212
- # Build Click context programmatically
213
- import click
214
-
215
- ctx = click.Context(command=handler)
212
+ try:
213
+ # Build argument list for Click command based on subcommand
214
+ click_args = []
216
215
 
217
- # Prepare keyword arguments from args
218
- kwargs = {}
219
- if hasattr(args, "format"):
220
- kwargs["format"] = args.format
221
- if hasattr(args, "hook_type"):
222
- kwargs["hook_type"] = args.hook_type
223
- if hasattr(args, "yes"):
224
- kwargs["yes"] = args.yes
216
+ # list command: --format, --hook-type
217
+ if subcommand == "list":
218
+ if hasattr(args, "format") and args.format:
219
+ click_args.extend(["--format", args.format])
220
+ if hasattr(args, "hook_type") and args.hook_type:
221
+ click_args.extend(["--hook-type", args.hook_type])
222
+ # clear command: --hook-type, -y
223
+ elif subcommand == "clear":
224
+ if hasattr(args, "hook_type") and args.hook_type:
225
+ click_args.extend(["--hook-type", args.hook_type])
226
+ if hasattr(args, "yes") and args.yes:
227
+ click_args.append("-y")
228
+ # diagnose command: hook_type (positional argument)
229
+ elif subcommand == "diagnose":
230
+ if hasattr(args, "hook_type") and args.hook_type:
231
+ click_args.append(args.hook_type)
232
+ # status and summary commands: no options
225
233
 
226
- try:
227
- # Invoke handler with arguments
228
- with ctx:
229
- handler.invoke(ctx, **kwargs)
234
+ # Call Click command with argument list and standalone_mode=False
235
+ handler(click_args, standalone_mode=False)
230
236
  return 0
231
237
  except SystemExit as e:
232
238
  return e.code if e.code is not None else 0
claude_mpm/core/logger.py CHANGED
@@ -214,16 +214,19 @@ def setup_logging(
214
214
 
215
215
  # Console handler
216
216
  if console_output:
217
+ # MUST use stderr to avoid corrupting hook JSON output
218
+ # WHY stderr: Hook handlers output JSON to stdout. Logging to stdout
219
+ # corrupts this JSON and causes "hook error" messages from Claude Code.
217
220
  if use_streaming:
218
221
  # Use streaming handler for single-line INFO messages
219
- console_handler = StreamingHandler(sys.stdout)
222
+ console_handler = StreamingHandler(sys.stderr)
220
223
  console_handler.setFormatter(simple_formatter)
221
224
  elif use_rich and not json_format:
222
225
  # Rich support has been removed, use standard handler
223
- console_handler = logging.StreamHandler(sys.stdout)
226
+ console_handler = logging.StreamHandler(sys.stderr)
224
227
  console_handler.setFormatter(simple_formatter)
225
228
  else:
226
- console_handler = logging.StreamHandler(sys.stdout)
229
+ console_handler = logging.StreamHandler(sys.stderr)
227
230
  console_handler.setFormatter(formatter if json_format else simple_formatter)
228
231
 
229
232
  console_handler.setLevel(logging.INFO)
@@ -263,7 +266,7 @@ def setup_logging(
263
266
  if deleted_count > 0:
264
267
  # Log to the new file handler that we're about to add
265
268
  pass # Deletion count will be logged when logger is ready
266
- except Exception:
269
+ except Exception: # nosec B110 - intentional: logging should not break app
267
270
  pass # Ignore cleanup errors
268
271
 
269
272
  # Also create a symlink to latest log (with thread safety)
@@ -305,7 +308,7 @@ def setup_logging(
305
308
  # Fallback: try to create a regular file with reference to actual log
306
309
  try:
307
310
  latest_link.write_text(f"Latest log: {log_file.name}\n")
308
- except Exception:
311
+ except Exception: # nosec B110 - intentional: logging should not break app
309
312
  pass # Silently fail - logging should not break the application
310
313
  except Exception as e:
311
314
  # Catch any other unexpected errors to ensure logging doesn't break
@@ -381,7 +384,7 @@ def cleanup_old_mpm_logs(
381
384
  try:
382
385
  log_file.unlink()
383
386
  deleted_count += 1
384
- except Exception:
387
+ except Exception: # nosec B110 - intentional: log cleanup is best-effort
385
388
  pass # Ignore deletion errors
386
389
 
387
390
  return deleted_count
@@ -108,8 +108,10 @@ class LoggerFactory:
108
108
  # Remove existing handlers
109
109
  root_logger.handlers = []
110
110
 
111
- # Console handler
112
- console_handler = logging.StreamHandler(sys.stdout)
111
+ # Console handler - MUST use stderr to avoid corrupting hook JSON output
112
+ # WHY stderr: Hook handlers output JSON to stdout. Logging to stdout
113
+ # corrupts this JSON and causes "hook error" messages from Claude Code.
114
+ console_handler = logging.StreamHandler(sys.stderr)
113
115
  console_handler.setLevel(LoggingConfig.LEVELS.get(cls._log_level, logging.INFO))
114
116
  console_formatter = logging.Formatter(
115
117
  log_format or LoggingConfig.DEFAULT_FORMAT,
@@ -58,8 +58,9 @@ class CLIContext:
58
58
  else "%(message)s"
59
59
  )
60
60
 
61
+ # MUST use stderr to avoid corrupting hook JSON output
61
62
  logging.basicConfig(
62
- level=level, format=format_str, handlers=[logging.StreamHandler(sys.stdout)]
63
+ level=level, format=format_str, handlers=[logging.StreamHandler(sys.stderr)]
63
64
  )
64
65
  self.debug = debug
65
66
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 5.4.103
3
+ Version: 5.4.105
4
4
  Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
5
5
  Author-email: Bob Matsuoka <bob@matsuoka.com>
6
6
  Maintainer: Claude MPM Team
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=57U_2gQXmrWSYBK2ignBCBhY7pDZ4wEvVAGp7bGluWY,8
2
+ claude_mpm/VERSION,sha256=_4W_UIilKx0gM1l25COCd6xS4MTWzvspsU_uyKDUTyA,8
3
3
  claude_mpm/__init__.py,sha256=AGfh00BHKvLYD-UVFw7qbKtl7NMRIzRXOWw7vEuZ-h4,2214
4
4
  claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
5
5
  claude_mpm/constants.py,sha256=pz3lTrZZR5HhV3eZzYtIbtBwWo7iM6pkBHP_ixxmI6Y,6827
@@ -39,7 +39,7 @@ claude_mpm/agents/templates/validation-templates.md,sha256=Y4_D7dphQaKigZWqKWvJ4
39
39
  claude_mpm/cli/__init__.py,sha256=j5x0uyJ4bRrKY1V4626cQI66OZsBzRz6JN26gQBxYSQ,4568
40
40
  claude_mpm/cli/__main__.py,sha256=KSy-J-vbTM2yXHOjsBJNZ60I2CJ2i5QP5zxsZV7-cjo,997
41
41
  claude_mpm/cli/chrome_devtools_installer.py,sha256=efA_ZX1iR3oaJi3222079BQw6DEG8KYr2HVGtgVj2Gs,5637
42
- claude_mpm/cli/executor.py,sha256=BswSkXHYbkBFuy0Wg7h1YpPExwK9KZZiev_630EB4Nc,14004
42
+ claude_mpm/cli/executor.py,sha256=rAo-zxp_QmSDpwLVX-BiaXdDQZUxD-9BjjOzsRmuExw,14734
43
43
  claude_mpm/cli/helpers.py,sha256=CypEhw0tbNH6_GzVTaQdi4w7ThCWO43Ep92YbJzPR4I,3638
44
44
  claude_mpm/cli/parser.py,sha256=Vqx9n-6Xo1uNhXR4rThmgWpZXTr0nOtkgDf3oMS9b0g,5855
45
45
  claude_mpm/cli/startup.py,sha256=JyNv5YZa_xC6B8fmw-mNxv0XK-XhIWFibJUz72Tg2H8,63021
@@ -200,9 +200,9 @@ claude_mpm/core/interactive_session.py,sha256=CW3_HNSMQ5pRi0mIh9_zBMncywARFV2AXL
200
200
  claude_mpm/core/interfaces.py,sha256=sSipQa2tjf9EbRaKhxeCE31E-alS_iddvUfI0X_I0LQ,26909
201
201
  claude_mpm/core/lazy.py,sha256=pyCfEqGHyLz18yXTu_uG52-II-9nCaBcpzwwQGBrQro,14808
202
202
  claude_mpm/core/log_manager.py,sha256=yf82AKC-DYLtl7h0ka5IEoVC8aC0_II-zCjHOwD3RxQ,24661
203
- claude_mpm/core/logger.py,sha256=PXfz2lh_ayygPgMrxpCm5hTm3dWtUB6x6L5zBG65iZ0,21507
203
+ claude_mpm/core/logger.py,sha256=9BJWz-7gOkRhYs6IDrXFwYkEKwe0c7WdpLiFaQcn0Ik,21899
204
204
  claude_mpm/core/logging_config.py,sha256=h6beZ1QQTOSM8RM_dq-LC-pnfA3iRxIcTtuGv9zusyI,14724
205
- claude_mpm/core/logging_utils.py,sha256=KKFkUW9rSxa28xk6L9EUK0DttBR1MWQk_AS-4fzWfTo,16007
205
+ claude_mpm/core/logging_utils.py,sha256=A7fVgLVs4k4qpWGHSoSoJcvW-g_cUEVnniIi_41keHE,16219
206
206
  claude_mpm/core/minimal_framework_loader.py,sha256=vmDEjL3MjnV7W4WIR-ymaL8QgsGsgxJJ0KdiQqAtudM,3640
207
207
  claude_mpm/core/mixins.py,sha256=vmZ7Nu2ZOnKjbhN07Ixk4noIej9nsJiknrp-Sclfu0A,5344
208
208
  claude_mpm/core/oneshot_session.py,sha256=nA86Zk7W3Rh_yIhPuegFL7Xgc9S63vQ_MqfLk52doV0,21994
@@ -317,7 +317,7 @@ claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py,sha25
317
317
  claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py,sha256=rm9mYQQ6rs5KgzFo4-ePqivUkx8aMH5bG8SkhyYPhNg,786
318
318
  claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py,sha256=dkhu6asdXnYt_3Tq5h-VSVVKBexflJqaRp7H3Sug_YI,6524
319
319
  claude_mpm/experimental/__init__.py,sha256=R_aclOvWpvSTHWAx9QXyg9OIPVK2dXT5tQJhxLQN11Y,369
320
- claude_mpm/experimental/cli_enhancements.py,sha256=ty_ich98J5C9QuJeH8hxVWvjVq0d1sbUboO0ZEWgXpg,11524
320
+ claude_mpm/experimental/cli_enhancements.py,sha256=Gxo5QrUuamggjChO-hzvzGTVsGLJLvzY0DqzFS8fU1M,11587
321
321
  claude_mpm/generators/__init__.py,sha256=rG8vwF_BjPmeMKvyMXpUA8uJ-7mtW2HTNfalZzgRlNk,153
322
322
  claude_mpm/generators/agent_profile_generator.py,sha256=yTEFdZPUt4lAfXlQuIIxzRwOrWMaJhEJ3Z6Ofm48Rlc,5740
323
323
  claude_mpm/hooks/__init__.py,sha256=T8VQOEtVW434xeN5J0W8qxqmBj5uE7moLqZ4cm8Uub0,1182
@@ -998,10 +998,10 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
998
998
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
999
999
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
1000
1000
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
1001
- claude_mpm-5.4.103.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
1002
- claude_mpm-5.4.103.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
1003
- claude_mpm-5.4.103.dist-info/METADATA,sha256=NTz8Ff8dITQFMajBmPONFXq6ouHiRbzyO572Xgir_wU,14350
1004
- claude_mpm-5.4.103.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1005
- claude_mpm-5.4.103.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
1006
- claude_mpm-5.4.103.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1007
- claude_mpm-5.4.103.dist-info/RECORD,,
1001
+ claude_mpm-5.4.105.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
1002
+ claude_mpm-5.4.105.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
1003
+ claude_mpm-5.4.105.dist-info/METADATA,sha256=fq_ncNJUhUEXEoKJSVRH6p4gCBu6XVBJoOFNF4jRc1M,14350
1004
+ claude_mpm-5.4.105.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1005
+ claude_mpm-5.4.105.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
1006
+ claude_mpm-5.4.105.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1007
+ claude_mpm-5.4.105.dist-info/RECORD,,