claude-mpm 4.21.3__py3-none-any.whl → 5.1.9__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +69 -1
- claude_mpm/agents/templates/circuit-breakers.md +1254 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +188 -30
- claude_mpm/cli/commands/agents.py +1128 -36
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +537 -239
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +935 -45
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +50 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +125 -167
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +757 -20
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +1032 -47
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +310 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +53 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +145 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +564 -108
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +14 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +19 -35
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +131 -10
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +110 -8
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +129 -1
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +225 -18
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +557 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +200 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +29 -9
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -180
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -211
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -140
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/ticketing.json +0 -177
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
"""Hook Error Memory System.
|
|
2
|
+
|
|
3
|
+
This module provides error detection and memory for hook execution to prevent
|
|
4
|
+
repeated errors and provide helpful diagnostics.
|
|
5
|
+
|
|
6
|
+
WHY this is needed:
|
|
7
|
+
- Hook processor can encounter transient or persistent errors
|
|
8
|
+
- Repeated failing commands waste resources and clutter logs
|
|
9
|
+
- Users need actionable suggestions to fix configuration issues
|
|
10
|
+
- System should learn from errors and prevent repetition
|
|
11
|
+
|
|
12
|
+
DESIGN DECISION: Store errors in JSON file rather than database because:
|
|
13
|
+
- Simple, human-readable format
|
|
14
|
+
- Easy to inspect and manually clear
|
|
15
|
+
- No additional dependencies
|
|
16
|
+
- Fast read/write for small datasets
|
|
17
|
+
- Users can easily delete to retry failed commands
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import re
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import Any, Dict, Optional
|
|
25
|
+
|
|
26
|
+
from ..core.logger import get_logger
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class HookErrorMemory:
|
|
30
|
+
"""Tracks and prevents repeated hook execution errors.
|
|
31
|
+
|
|
32
|
+
WHY this design:
|
|
33
|
+
- Detects common error patterns automatically
|
|
34
|
+
- Stores error history to prevent repetition
|
|
35
|
+
- Provides actionable fix suggestions
|
|
36
|
+
- Allows manual retry by clearing memory
|
|
37
|
+
- Minimal performance overhead (<1ms per check)
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
# Error pattern definitions with detection regexes
|
|
41
|
+
ERROR_PATTERNS = [
|
|
42
|
+
(r"no such file or directory[:\s]+(.+?)(?:\n|$)", "file_not_found"),
|
|
43
|
+
(r"command not found[:\s]+(.+?)(?:\n|$)", "command_not_found"),
|
|
44
|
+
(r"permission denied[:\s]+(.+?)(?:\n|$)", "permission_denied"),
|
|
45
|
+
(r"syntax error", "syntax_error"),
|
|
46
|
+
(r"Error:\s*\(eval\):(\d+):\s*(.+?)(?:\n|$)", "eval_error"),
|
|
47
|
+
(r"Error:\s*(.+?)(?:\n|$)", "general_error"),
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
def __init__(self, memory_file: Optional[Path] = None):
|
|
51
|
+
"""Initialize hook error memory.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
memory_file: Path to memory file (default: .claude-mpm/hook_errors.json)
|
|
55
|
+
"""
|
|
56
|
+
self.logger = get_logger("hook_error_memory")
|
|
57
|
+
|
|
58
|
+
# Use default location if not specified
|
|
59
|
+
if memory_file is None:
|
|
60
|
+
memory_file = Path.cwd() / ".claude-mpm" / "hook_errors.json"
|
|
61
|
+
|
|
62
|
+
self.memory_file = memory_file
|
|
63
|
+
self.errors: Dict[str, Any] = self._load_errors()
|
|
64
|
+
|
|
65
|
+
def _load_errors(self) -> Dict[str, Any]:
|
|
66
|
+
"""Load previously encountered errors from disk.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Dictionary of error records
|
|
70
|
+
"""
|
|
71
|
+
if not self.memory_file.exists():
|
|
72
|
+
return {}
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
content = self.memory_file.read_text()
|
|
76
|
+
if not content.strip():
|
|
77
|
+
return {}
|
|
78
|
+
return json.loads(content)
|
|
79
|
+
except json.JSONDecodeError as e:
|
|
80
|
+
self.logger.warning(f"Failed to parse error memory file: {e}")
|
|
81
|
+
return {}
|
|
82
|
+
except Exception as e:
|
|
83
|
+
self.logger.error(f"Error loading error memory: {e}")
|
|
84
|
+
return {}
|
|
85
|
+
|
|
86
|
+
def _save_errors(self):
|
|
87
|
+
"""Persist errors to disk."""
|
|
88
|
+
try:
|
|
89
|
+
# Ensure directory exists
|
|
90
|
+
self.memory_file.parent.mkdir(parents=True, exist_ok=True)
|
|
91
|
+
|
|
92
|
+
# Write with pretty formatting for human readability
|
|
93
|
+
self.memory_file.write_text(json.dumps(self.errors, indent=2))
|
|
94
|
+
except Exception as e:
|
|
95
|
+
self.logger.error(f"Failed to save error memory: {e}")
|
|
96
|
+
|
|
97
|
+
def detect_error(
|
|
98
|
+
self, output: str, stderr: str, returncode: int
|
|
99
|
+
) -> Optional[Dict[str, str]]:
|
|
100
|
+
"""Detect if output contains an error.
|
|
101
|
+
|
|
102
|
+
WHY check both stdout and stderr:
|
|
103
|
+
- Some commands write errors to stdout
|
|
104
|
+
- Some write to stderr
|
|
105
|
+
- Return code alone isn't enough (some hooks return non-zero on purpose)
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
output: Standard output from command
|
|
109
|
+
stderr: Standard error from command
|
|
110
|
+
returncode: Exit code from command
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Dict with error info if detected, None otherwise
|
|
114
|
+
"""
|
|
115
|
+
# Combine output sources for comprehensive error detection
|
|
116
|
+
combined_output = f"{output}\n{stderr}"
|
|
117
|
+
|
|
118
|
+
# Try each pattern in order of specificity
|
|
119
|
+
for pattern, error_type in self.ERROR_PATTERNS:
|
|
120
|
+
match = re.search(pattern, combined_output, re.IGNORECASE | re.MULTILINE)
|
|
121
|
+
if match:
|
|
122
|
+
# Extract details from the match
|
|
123
|
+
details = match.group(1) if match.groups() else match.group(0)
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
"type": error_type,
|
|
127
|
+
"pattern": pattern,
|
|
128
|
+
"match": match.group(0).strip(),
|
|
129
|
+
"details": details.strip() if details else "",
|
|
130
|
+
"returncode": returncode,
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# If no pattern matched but returncode is non-zero, record as generic error
|
|
134
|
+
if returncode != 0 and combined_output.strip():
|
|
135
|
+
return {
|
|
136
|
+
"type": "unknown_error",
|
|
137
|
+
"pattern": "non-zero exit code",
|
|
138
|
+
"match": f"Exit code: {returncode}",
|
|
139
|
+
"details": combined_output[:200].strip(), # First 200 chars
|
|
140
|
+
"returncode": returncode,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
def record_error(self, error_info: Dict[str, str], hook_type: str):
|
|
146
|
+
"""Record an error to prevent future repetition.
|
|
147
|
+
|
|
148
|
+
WHY use composite key:
|
|
149
|
+
- Same error type can occur with different details
|
|
150
|
+
- Want to track specific error instances
|
|
151
|
+
- Hook type context helps with diagnosis
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
error_info: Error information from detect_error()
|
|
155
|
+
hook_type: Type of hook that failed (e.g., "PreToolUse")
|
|
156
|
+
"""
|
|
157
|
+
# Create unique key for this error
|
|
158
|
+
key = f"{error_info['type']}:{hook_type}:{error_info['details']}"
|
|
159
|
+
|
|
160
|
+
now = datetime.now(timezone.utc).isoformat()
|
|
161
|
+
|
|
162
|
+
if key in self.errors:
|
|
163
|
+
# Update existing error
|
|
164
|
+
self.errors[key]["count"] += 1
|
|
165
|
+
self.errors[key]["last_seen"] = now
|
|
166
|
+
else:
|
|
167
|
+
# Record new error
|
|
168
|
+
self.errors[key] = {
|
|
169
|
+
"type": error_info["type"],
|
|
170
|
+
"hook_type": hook_type,
|
|
171
|
+
"details": error_info["details"],
|
|
172
|
+
"match": error_info["match"],
|
|
173
|
+
"returncode": error_info.get("returncode", 1),
|
|
174
|
+
"count": 1,
|
|
175
|
+
"first_seen": now,
|
|
176
|
+
"last_seen": now,
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
self._save_errors()
|
|
180
|
+
self.logger.debug(
|
|
181
|
+
f"Recorded error: {error_info['type']} (count: {self.errors[key]['count']})"
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
def is_known_failing_hook(self, hook_type: str) -> Optional[Dict[str, Any]]:
|
|
185
|
+
"""Check if a hook type is known to fail repeatedly.
|
|
186
|
+
|
|
187
|
+
WHY check for 2+ failures:
|
|
188
|
+
- Single failure could be transient
|
|
189
|
+
- 2+ failures indicate persistent issue
|
|
190
|
+
- Balance between retry attempts and error prevention
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
hook_type: Type of hook to check
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
Error data if hook is known to fail, None otherwise
|
|
197
|
+
"""
|
|
198
|
+
# Find any errors for this hook type with 2+ occurrences
|
|
199
|
+
for key, error_data in self.errors.items():
|
|
200
|
+
if error_data["hook_type"] == hook_type and error_data["count"] >= 2:
|
|
201
|
+
return error_data
|
|
202
|
+
|
|
203
|
+
return None
|
|
204
|
+
|
|
205
|
+
def should_skip_hook(self, hook_type: str, threshold: int = 2) -> bool:
|
|
206
|
+
"""Determine if a hook should be skipped due to repeated failures.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
hook_type: Type of hook to check
|
|
210
|
+
threshold: Minimum failure count to skip (default: 2)
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
True if hook should be skipped
|
|
214
|
+
"""
|
|
215
|
+
error_data = self.is_known_failing_hook(hook_type)
|
|
216
|
+
return error_data is not None and error_data["count"] >= threshold
|
|
217
|
+
|
|
218
|
+
def suggest_fix(self, error_info: Dict[str, str]) -> str:
|
|
219
|
+
"""Suggest a fix for the detected error.
|
|
220
|
+
|
|
221
|
+
WHY provide suggestions:
|
|
222
|
+
- Users need actionable guidance
|
|
223
|
+
- Common errors have known solutions
|
|
224
|
+
- Reduces support burden
|
|
225
|
+
- Improves user experience
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
error_info: Error information from detect_error()
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
Human-readable fix suggestion
|
|
232
|
+
"""
|
|
233
|
+
error_type = error_info["type"]
|
|
234
|
+
details = error_info.get("details", "")
|
|
235
|
+
|
|
236
|
+
suggestions = {
|
|
237
|
+
"file_not_found": f"""File not found: {details}
|
|
238
|
+
|
|
239
|
+
Possible fixes:
|
|
240
|
+
1. Check if the file exists: ls -la {details}
|
|
241
|
+
2. Verify the path is correct in your hook configuration
|
|
242
|
+
3. If it's a script, ensure it's executable: chmod +x {details}
|
|
243
|
+
4. Clear error memory to retry: rm {self.memory_file}
|
|
244
|
+
""",
|
|
245
|
+
"command_not_found": f"""Command not found: {details}
|
|
246
|
+
|
|
247
|
+
Possible fixes:
|
|
248
|
+
1. Install the missing command
|
|
249
|
+
2. Check if it's in your PATH: which {details}
|
|
250
|
+
3. Update hook configuration to use absolute path
|
|
251
|
+
4. Remove the hook if no longer needed
|
|
252
|
+
""",
|
|
253
|
+
"permission_denied": f"""Permission denied: {details}
|
|
254
|
+
|
|
255
|
+
Possible fixes:
|
|
256
|
+
1. Check file permissions: ls -la {details}
|
|
257
|
+
2. Make file executable: chmod +x {details}
|
|
258
|
+
3. Run with appropriate privileges
|
|
259
|
+
4. Check file ownership
|
|
260
|
+
""",
|
|
261
|
+
"syntax_error": """Syntax error in hook configuration or script
|
|
262
|
+
|
|
263
|
+
Possible fixes:
|
|
264
|
+
1. Review hook configuration in .claude-mpm/config
|
|
265
|
+
2. Check script syntax if using shell hooks
|
|
266
|
+
3. Validate JSON configuration format
|
|
267
|
+
4. Check for typos in hook definitions
|
|
268
|
+
""",
|
|
269
|
+
"eval_error": f"""Error in hook execution: {details}
|
|
270
|
+
|
|
271
|
+
Possible fixes:
|
|
272
|
+
1. Review hook handler logs for details
|
|
273
|
+
2. Check hook configuration syntax
|
|
274
|
+
3. Verify all required dependencies are available
|
|
275
|
+
4. Test hook handler manually: python {details}
|
|
276
|
+
""",
|
|
277
|
+
"general_error": f"""Error during hook execution: {error_info.get("match", "Unknown error")}
|
|
278
|
+
|
|
279
|
+
Possible fixes:
|
|
280
|
+
1. Check logs for detailed error information
|
|
281
|
+
2. Verify hook configuration is correct
|
|
282
|
+
3. Ensure all dependencies are installed
|
|
283
|
+
4. Clear error memory to retry: rm {self.memory_file}
|
|
284
|
+
""",
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return suggestions.get(
|
|
288
|
+
error_type, f"Unknown error type: {error_type}\n\nDetails: {details}"
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
def clear_errors(self, hook_type: Optional[str] = None):
|
|
292
|
+
"""Clear error memory to allow retry of failed hooks.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
hook_type: If specified, only clear errors for this hook type
|
|
296
|
+
"""
|
|
297
|
+
if hook_type is None:
|
|
298
|
+
# Clear all errors
|
|
299
|
+
count = len(self.errors)
|
|
300
|
+
self.errors.clear()
|
|
301
|
+
self._save_errors()
|
|
302
|
+
self.logger.info(f"Cleared all {count} error records")
|
|
303
|
+
else:
|
|
304
|
+
# Clear errors for specific hook type
|
|
305
|
+
keys_to_remove = [
|
|
306
|
+
key
|
|
307
|
+
for key, data in self.errors.items()
|
|
308
|
+
if data["hook_type"] == hook_type
|
|
309
|
+
]
|
|
310
|
+
for key in keys_to_remove:
|
|
311
|
+
del self.errors[key]
|
|
312
|
+
self._save_errors()
|
|
313
|
+
self.logger.info(
|
|
314
|
+
f"Cleared {len(keys_to_remove)} error records for {hook_type}"
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
def get_error_summary(self) -> Dict[str, Any]:
|
|
318
|
+
"""Get summary of all recorded errors.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
Dictionary with error statistics and details
|
|
322
|
+
"""
|
|
323
|
+
if not self.errors:
|
|
324
|
+
return {
|
|
325
|
+
"total_errors": 0,
|
|
326
|
+
"unique_errors": 0,
|
|
327
|
+
"errors_by_type": {},
|
|
328
|
+
"errors_by_hook": {},
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
errors_by_type = {}
|
|
332
|
+
errors_by_hook = {}
|
|
333
|
+
|
|
334
|
+
total_count = 0
|
|
335
|
+
|
|
336
|
+
for error_data in self.errors.values():
|
|
337
|
+
error_type = error_data["type"]
|
|
338
|
+
hook_type = error_data["hook_type"]
|
|
339
|
+
count = error_data["count"]
|
|
340
|
+
|
|
341
|
+
total_count += count
|
|
342
|
+
|
|
343
|
+
errors_by_type[error_type] = errors_by_type.get(error_type, 0) + count
|
|
344
|
+
errors_by_hook[hook_type] = errors_by_hook.get(hook_type, 0) + count
|
|
345
|
+
|
|
346
|
+
return {
|
|
347
|
+
"total_errors": total_count,
|
|
348
|
+
"unique_errors": len(self.errors),
|
|
349
|
+
"errors_by_type": errors_by_type,
|
|
350
|
+
"errors_by_hook": errors_by_hook,
|
|
351
|
+
"memory_file": str(self.memory_file),
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
# Global instance
|
|
356
|
+
_hook_error_memory: Optional[HookErrorMemory] = None
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def get_hook_error_memory(memory_file: Optional[Path] = None) -> HookErrorMemory:
|
|
360
|
+
"""Get the global hook error memory instance.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
memory_file: Optional custom memory file path
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
HookErrorMemory instance
|
|
367
|
+
"""
|
|
368
|
+
global _hook_error_memory
|
|
369
|
+
if _hook_error_memory is None:
|
|
370
|
+
_hook_error_memory = HookErrorMemory(memory_file)
|
|
371
|
+
return _hook_error_memory
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def clear_hook_errors(hook_type: Optional[str] = None):
|
|
375
|
+
"""Convenience function to clear hook error memory.
|
|
376
|
+
|
|
377
|
+
Args:
|
|
378
|
+
hook_type: If specified, only clear errors for this hook type
|
|
379
|
+
"""
|
|
380
|
+
memory = get_hook_error_memory()
|
|
381
|
+
memory.clear_errors(hook_type)
|
claude_mpm/core/hook_manager.py
CHANGED
|
@@ -23,6 +23,7 @@ from datetime import datetime, timezone
|
|
|
23
23
|
from typing import Any, Dict, Optional
|
|
24
24
|
|
|
25
25
|
from ..core.logger import get_logger
|
|
26
|
+
from .hook_error_memory import get_hook_error_memory
|
|
26
27
|
from .hook_performance_config import get_hook_performance_config
|
|
27
28
|
from .unified_paths import get_package_root
|
|
28
29
|
|
|
@@ -42,6 +43,9 @@ class HookManager:
|
|
|
42
43
|
self.session_id = self._get_or_create_session_id()
|
|
43
44
|
self.hook_handler_path = self._find_hook_handler()
|
|
44
45
|
|
|
46
|
+
# Initialize error memory for tracking and preventing repeated errors
|
|
47
|
+
self.error_memory = get_hook_error_memory()
|
|
48
|
+
|
|
45
49
|
# Initialize background hook processing for async execution
|
|
46
50
|
self.performance_config = get_hook_performance_config()
|
|
47
51
|
queue_config = self.performance_config.get_queue_config()
|
|
@@ -97,11 +101,31 @@ class HookManager:
|
|
|
97
101
|
self.logger.debug("Started background hook processor thread")
|
|
98
102
|
|
|
99
103
|
def _execute_hook_sync(self, hook_data: Dict[str, Any]):
|
|
100
|
-
"""Execute a single hook synchronously in the background thread.
|
|
104
|
+
"""Execute a single hook synchronously in the background thread with error detection.
|
|
105
|
+
|
|
106
|
+
WHY error detection:
|
|
107
|
+
- Prevents repeated execution of failing hooks
|
|
108
|
+
- Provides actionable error messages to users
|
|
109
|
+
- Learns from failures to improve system reliability
|
|
110
|
+
- Reduces log noise from repeated errors
|
|
111
|
+
"""
|
|
101
112
|
try:
|
|
102
113
|
hook_type = hook_data["hook_type"]
|
|
103
114
|
event_data = hook_data["event_data"]
|
|
104
115
|
|
|
116
|
+
# Check if this hook is known to fail repeatedly
|
|
117
|
+
if self.error_memory.should_skip_hook(hook_type):
|
|
118
|
+
known_error = self.error_memory.is_known_failing_hook(hook_type)
|
|
119
|
+
if known_error:
|
|
120
|
+
# Log warning but don't spam - only on first skip
|
|
121
|
+
if known_error["count"] == 2: # First time we're skipping
|
|
122
|
+
self.logger.warning(
|
|
123
|
+
f"⚠️ Skipping {hook_type} hook - failed {known_error['count']} times previously\n"
|
|
124
|
+
f"Error: {known_error['match']}\n"
|
|
125
|
+
f"To retry: rm {self.error_memory.memory_file}"
|
|
126
|
+
)
|
|
127
|
+
return
|
|
128
|
+
|
|
105
129
|
# Create the hook event
|
|
106
130
|
hook_event = {
|
|
107
131
|
"hook_event_name": hook_type,
|
|
@@ -127,7 +151,22 @@ class HookManager:
|
|
|
127
151
|
check=False,
|
|
128
152
|
)
|
|
129
153
|
|
|
130
|
-
|
|
154
|
+
# Detect errors in the output
|
|
155
|
+
error_info = self.error_memory.detect_error(
|
|
156
|
+
result.stdout or "", result.stderr or "", result.returncode
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
if error_info:
|
|
160
|
+
# Record the error
|
|
161
|
+
self.error_memory.record_error(error_info, hook_type)
|
|
162
|
+
|
|
163
|
+
# Get fix suggestion
|
|
164
|
+
suggestion = self.error_memory.suggest_fix(error_info)
|
|
165
|
+
|
|
166
|
+
# Log error with suggestion
|
|
167
|
+
self.logger.warning(f"Hook {hook_type} error detected:\n{suggestion}")
|
|
168
|
+
elif result.returncode != 0:
|
|
169
|
+
# Non-zero return without detected pattern
|
|
131
170
|
self.logger.debug(f"Hook {hook_type} returned code {result.returncode}")
|
|
132
171
|
if result.stderr:
|
|
133
172
|
self.logger.debug(f"Hook stderr: {result.stderr}")
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
This module provides the InteractiveSession class that manages Claude's interactive mode
|
|
4
4
|
with proper separation of concerns and reduced complexity.
|
|
5
|
+
|
|
6
|
+
DEPENDENCY INJECTION:
|
|
7
|
+
This module uses protocol-based dependency injection to break circular imports.
|
|
8
|
+
Instead of importing ClaudeRunner directly, it uses ClaudeRunnerProtocol which
|
|
9
|
+
defines the interface it needs. This allows ClaudeRunner to create instances
|
|
10
|
+
of InteractiveSession without circular dependency issues.
|
|
5
11
|
"""
|
|
6
12
|
|
|
7
13
|
import contextlib
|
|
@@ -9,11 +15,18 @@ import os
|
|
|
9
15
|
import subprocess
|
|
10
16
|
import uuid
|
|
11
17
|
from pathlib import Path
|
|
12
|
-
from typing import Any, Dict, Optional, Tuple
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple
|
|
13
19
|
|
|
14
20
|
from claude_mpm.core.enums import ServiceState
|
|
15
21
|
from claude_mpm.core.logger import get_logger
|
|
16
22
|
|
|
23
|
+
# Protocol imports for type checking without circular dependencies
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from claude_mpm.core.protocols import ClaudeRunnerProtocol
|
|
26
|
+
else:
|
|
27
|
+
# At runtime, accept any object with matching interface
|
|
28
|
+
ClaudeRunnerProtocol = Any
|
|
29
|
+
|
|
17
30
|
|
|
18
31
|
class InteractiveSession:
|
|
19
32
|
"""
|
|
@@ -28,13 +41,14 @@ class InteractiveSession:
|
|
|
28
41
|
and makes testing easier while preserving all original functionality.
|
|
29
42
|
"""
|
|
30
43
|
|
|
31
|
-
def __init__(self, runner):
|
|
44
|
+
def __init__(self, runner: "ClaudeRunnerProtocol"):
|
|
32
45
|
"""Initialize interactive session handler.
|
|
33
46
|
|
|
34
47
|
Args:
|
|
35
|
-
runner: ClaudeRunner instance
|
|
48
|
+
runner: ClaudeRunner instance (or any object matching ClaudeRunnerProtocol)
|
|
49
|
+
with all necessary services
|
|
36
50
|
"""
|
|
37
|
-
self.runner = runner
|
|
51
|
+
self.runner: ClaudeRunnerProtocol = runner
|
|
38
52
|
self.logger = get_logger("interactive_session")
|
|
39
53
|
self.session_id = None
|
|
40
54
|
self.original_cwd = Path.cwd()
|
|
@@ -85,8 +99,8 @@ class InteractiveSession:
|
|
|
85
99
|
self.logger.warning(f"WebSocket initialization failed: {error}")
|
|
86
100
|
# Continue without WebSocket - not a fatal error
|
|
87
101
|
|
|
88
|
-
#
|
|
89
|
-
|
|
102
|
+
# Banner now displayed in CLI startup - see startup_display.py
|
|
103
|
+
# Removed duplicate _display_welcome_message() to consolidate with main banner
|
|
90
104
|
|
|
91
105
|
# Log session start
|
|
92
106
|
if self.runner.project_logger:
|
|
@@ -293,7 +307,12 @@ class InteractiveSession:
|
|
|
293
307
|
return False, f"Unexpected error with Socket.IO: {e}"
|
|
294
308
|
|
|
295
309
|
def _display_welcome_message(self) -> None:
|
|
296
|
-
"""Display the interactive session welcome message.
|
|
310
|
+
"""Display the interactive session welcome message.
|
|
311
|
+
|
|
312
|
+
DEPRECATED: This method is kept for backward compatibility with tests.
|
|
313
|
+
The main banner is now displayed in startup_display.py during CLI startup.
|
|
314
|
+
This consolidated approach prevents duplicate banners.
|
|
315
|
+
"""
|
|
297
316
|
version_str = self.runner._get_version()
|
|
298
317
|
|
|
299
318
|
# Get output style status
|
|
@@ -383,12 +402,82 @@ class InteractiveSession:
|
|
|
383
402
|
self.logger.debug(f"Raw claude_args received: {self.runner.claude_args}")
|
|
384
403
|
cmd.extend(self.runner.claude_args)
|
|
385
404
|
|
|
386
|
-
# Add
|
|
387
|
-
|
|
405
|
+
# Add --agents flag if native agents mode is enabled
|
|
406
|
+
if getattr(self.runner, "use_native_agents", False):
|
|
407
|
+
agents_flag = self._build_agents_flag()
|
|
408
|
+
if agents_flag:
|
|
409
|
+
# Add --agents JSON directly (already properly formatted)
|
|
410
|
+
cmd.extend(agents_flag)
|
|
411
|
+
self.logger.info("✓ Native agents mode: Using --agents CLI flag")
|
|
412
|
+
|
|
413
|
+
# Add system instructions with file-based caching
|
|
414
|
+
from claude_mpm.core.system_context import create_simple_context
|
|
415
|
+
from claude_mpm.services.instructions.instruction_cache_service import (
|
|
416
|
+
InstructionCacheService,
|
|
417
|
+
)
|
|
388
418
|
|
|
389
419
|
system_prompt = self.runner._create_system_prompt()
|
|
390
420
|
if system_prompt and system_prompt != create_simple_context():
|
|
391
|
-
|
|
421
|
+
# Try to use cached instruction file for better performance
|
|
422
|
+
try:
|
|
423
|
+
# Initialize cache service with project root
|
|
424
|
+
if "CLAUDE_MPM_USER_PWD" in os.environ:
|
|
425
|
+
project_root = Path(os.environ["CLAUDE_MPM_USER_PWD"])
|
|
426
|
+
else:
|
|
427
|
+
project_root = Path.cwd()
|
|
428
|
+
|
|
429
|
+
# Instruction Caching (1M-446)
|
|
430
|
+
# Cache assembled instructions to file to avoid ARG_MAX limits on Linux/Windows.
|
|
431
|
+
# - Linux: 128 KB limit, instructions are ~152 KB (exceeds by 19.1%)
|
|
432
|
+
# - Windows: 32 KB limit (exceeds by 476%)
|
|
433
|
+
# Cache updates only when content hash changes (hash-based invalidation).
|
|
434
|
+
# Fallback to inline instruction if cache fails (graceful degradation).
|
|
435
|
+
cache_service = InstructionCacheService(project_root=project_root)
|
|
436
|
+
|
|
437
|
+
# Update cache with assembled instruction content
|
|
438
|
+
cache_result = cache_service.update_cache(
|
|
439
|
+
instruction_content=system_prompt
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
# Use cache file if available
|
|
443
|
+
if (
|
|
444
|
+
cache_result.get("updated")
|
|
445
|
+
or cache_service.get_cache_path().exists()
|
|
446
|
+
):
|
|
447
|
+
cache_file = cache_service.get_cache_path()
|
|
448
|
+
|
|
449
|
+
# Log cache operation
|
|
450
|
+
if cache_result.get("updated"):
|
|
451
|
+
self.logger.info(
|
|
452
|
+
f"Instruction cache updated: {cache_result.get('reason', 'unknown')}"
|
|
453
|
+
)
|
|
454
|
+
self.logger.debug(
|
|
455
|
+
f"Cache hash: {cache_result.get('content_hash', 'N/A')[:8]}..."
|
|
456
|
+
)
|
|
457
|
+
self.logger.debug(
|
|
458
|
+
f"Cache size: {cache_result.get('content_size_kb', 'N/A')} KB"
|
|
459
|
+
)
|
|
460
|
+
else:
|
|
461
|
+
self.logger.debug(
|
|
462
|
+
f"Using cached instructions: {cache_result.get('reason', 'unknown')}"
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
# Use file-based loading for better performance
|
|
466
|
+
cmd.extend(["--system-prompt-file", str(cache_file)])
|
|
467
|
+
self.logger.info(
|
|
468
|
+
f"✓ Using file-based instruction loading: {cache_file}"
|
|
469
|
+
)
|
|
470
|
+
else:
|
|
471
|
+
# Fallback to inline if cache file doesn't exist
|
|
472
|
+
self.logger.warning(
|
|
473
|
+
"Cache file not available, falling back to inline instruction"
|
|
474
|
+
)
|
|
475
|
+
cmd.extend(["--append-system-prompt", system_prompt])
|
|
476
|
+
|
|
477
|
+
except Exception as e:
|
|
478
|
+
# Graceful fallback - cache failures don't break deployment
|
|
479
|
+
self.logger.warning(f"Failed to cache instructions, using inline: {e}")
|
|
480
|
+
cmd.extend(["--append-system-prompt", system_prompt])
|
|
392
481
|
|
|
393
482
|
# Final command verification
|
|
394
483
|
# self.logger.info(f"Final Claude command built: {' '.join(cmd)}")
|
|
@@ -402,6 +491,38 @@ class InteractiveSession:
|
|
|
402
491
|
|
|
403
492
|
return cmd
|
|
404
493
|
|
|
494
|
+
def _build_agents_flag(self) -> Optional[list]:
|
|
495
|
+
"""Build --agents flag with all MPM agents.
|
|
496
|
+
|
|
497
|
+
Returns:
|
|
498
|
+
List with ["--agents", "<json>"] or None if conversion fails
|
|
499
|
+
"""
|
|
500
|
+
try:
|
|
501
|
+
from claude_mpm.services.native_agent_converter import NativeAgentConverter
|
|
502
|
+
|
|
503
|
+
converter = NativeAgentConverter()
|
|
504
|
+
agents = converter.load_agents_from_templates()
|
|
505
|
+
|
|
506
|
+
if not agents:
|
|
507
|
+
self.logger.warning("No agents loaded for native mode")
|
|
508
|
+
return None
|
|
509
|
+
|
|
510
|
+
# Generate JSON for --agents flag
|
|
511
|
+
agents_json = converter.generate_agents_json(agents)
|
|
512
|
+
summary = converter.get_conversion_summary(agents)
|
|
513
|
+
|
|
514
|
+
self.logger.info(
|
|
515
|
+
f"Native agents: {summary['total_agents']} agents, "
|
|
516
|
+
f"{summary['json_size_kb']} KB JSON"
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
# Return as list: ["--agents", "<json>"]
|
|
520
|
+
return ["--agents", agents_json]
|
|
521
|
+
|
|
522
|
+
except Exception as e:
|
|
523
|
+
self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
|
|
524
|
+
return None
|
|
525
|
+
|
|
405
526
|
def _prepare_environment(self) -> dict:
|
|
406
527
|
"""Prepare clean environment variables for Claude."""
|
|
407
528
|
clean_env = os.environ.copy()
|
claude_mpm/core/logger.py
CHANGED
|
@@ -225,7 +225,9 @@ def setup_logging(
|
|
|
225
225
|
|
|
226
226
|
# Use rotating file handler
|
|
227
227
|
file_handler = logging.handlers.RotatingFileHandler(
|
|
228
|
-
log_file,
|
|
228
|
+
log_file,
|
|
229
|
+
maxBytes=10 * 1024 * 1024,
|
|
230
|
+
backupCount=5, # 10 MB
|
|
229
231
|
)
|
|
230
232
|
else:
|
|
231
233
|
# Use default log directory
|