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 +1 -1
- claude_mpm/cli/executor.py +23 -17
- claude_mpm/core/logger.py +9 -6
- claude_mpm/core/logging_utils.py +4 -2
- claude_mpm/experimental/cli_enhancements.py +2 -1
- {claude_mpm-5.4.103.dist-info → claude_mpm-5.4.105.dist-info}/METADATA +1 -1
- {claude_mpm-5.4.103.dist-info → claude_mpm-5.4.105.dist-info}/RECORD +12 -12
- {claude_mpm-5.4.103.dist-info → claude_mpm-5.4.105.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.103.dist-info → claude_mpm-5.4.105.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.103.dist-info → claude_mpm-5.4.105.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.103.dist-info → claude_mpm-5.4.105.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.103.dist-info → claude_mpm-5.4.105.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.4.
|
|
1
|
+
5.4.105
|
claude_mpm/cli/executor.py
CHANGED
|
@@ -206,27 +206,33 @@ def execute_command(command: str, args) -> int:
|
|
|
206
206
|
"status": show_status,
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
-
# Get handler and
|
|
209
|
+
# Get handler and call it with argument list (same pattern as autotodos)
|
|
210
210
|
handler = handlers.get(subcommand)
|
|
211
211
|
if handler:
|
|
212
|
-
|
|
213
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
227
|
-
|
|
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.
|
|
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.
|
|
226
|
+
console_handler = logging.StreamHandler(sys.stderr)
|
|
224
227
|
console_handler.setFormatter(simple_formatter)
|
|
225
228
|
else:
|
|
226
|
-
console_handler = logging.StreamHandler(sys.
|
|
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
|
claude_mpm/core/logging_utils.py
CHANGED
|
@@ -108,8 +108,10 @@ class LoggerFactory:
|
|
|
108
108
|
# Remove existing handlers
|
|
109
109
|
root_logger.handlers = []
|
|
110
110
|
|
|
111
|
-
# Console handler
|
|
112
|
-
|
|
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.
|
|
63
|
+
level=level, format=format_str, handlers=[logging.StreamHandler(sys.stderr)]
|
|
63
64
|
)
|
|
64
65
|
self.debug = debug
|
|
65
66
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
|
|
2
|
-
claude_mpm/VERSION,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1002
|
-
claude_mpm-5.4.
|
|
1003
|
-
claude_mpm-5.4.
|
|
1004
|
-
claude_mpm-5.4.
|
|
1005
|
-
claude_mpm-5.4.
|
|
1006
|
-
claude_mpm-5.4.
|
|
1007
|
-
claude_mpm-5.4.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|