claude-mpm 4.1.26__py3-none-any.whl → 4.24.0__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/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +420 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +299 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +7 -4
- claude_mpm/agents/templates/{agentic_coder_optimizer.json → agentic-coder-optimizer.json} +33 -7
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +10 -4
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +43 -9
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +14 -4
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +25 -5
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +46 -21
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +167 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -378
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +15 -10
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +469 -1064
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +7 -7
- claude_mpm/cli/commands/doctor.py +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agents_parser.py +116 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +143 -3
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +118 -8
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +137 -14
- claude_mpm/commands/mpm-help.md +285 -5
- claude_mpm/commands/mpm-init.md +374 -15
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +71 -9
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +15 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +19 -8
- claude_mpm/core/config.py +85 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +38 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/dashboard.css +588 -6
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
- claude_mpm/dashboard/static/js/components/session-manager.js +7 -7
- claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +455 -23
- claude_mpm/dashboard/static/js/components/working-directory.js +44 -9
- claude_mpm/dashboard/static/js/dashboard.js +245 -132
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +49 -22
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +112 -109
- claude_mpm/experimental/cli_enhancements.py +4 -2
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +183 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +33 -7
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +715 -47
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +9 -7
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +79 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +8 -4
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1612 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +729 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +141 -4
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +23 -21
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +2 -2
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +470 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +8 -4
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/tools/__main__.py +1 -1
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +108 -27
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +2 -2
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -9,7 +9,8 @@ import os
|
|
|
9
9
|
import re
|
|
10
10
|
import subprocess
|
|
11
11
|
import sys
|
|
12
|
-
from datetime import datetime
|
|
12
|
+
from datetime import datetime, timezone
|
|
13
|
+
from pathlib import Path
|
|
13
14
|
from typing import Optional
|
|
14
15
|
|
|
15
16
|
# Import tool analysis with fallback for direct execution
|
|
@@ -77,7 +78,7 @@ class EventHandlers:
|
|
|
77
78
|
"session_id": event.get("session_id", ""),
|
|
78
79
|
"working_directory": working_dir,
|
|
79
80
|
"git_branch": git_branch,
|
|
80
|
-
"timestamp": datetime.now().isoformat(),
|
|
81
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
81
82
|
"is_command": prompt.startswith("/"),
|
|
82
83
|
"contains_code": "```" in prompt
|
|
83
84
|
or "python" in prompt.lower()
|
|
@@ -101,7 +102,7 @@ class EventHandlers:
|
|
|
101
102
|
if session_id:
|
|
102
103
|
self.hook_handler.pending_prompts[session_id] = {
|
|
103
104
|
"prompt": prompt,
|
|
104
|
-
"timestamp": datetime.now().isoformat(),
|
|
105
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
105
106
|
"working_directory": working_dir,
|
|
106
107
|
}
|
|
107
108
|
if DEBUG:
|
|
@@ -150,7 +151,7 @@ class EventHandlers:
|
|
|
150
151
|
"session_id": event.get("session_id", ""),
|
|
151
152
|
"working_directory": working_dir,
|
|
152
153
|
"git_branch": git_branch,
|
|
153
|
-
"timestamp": datetime.now().isoformat(),
|
|
154
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
154
155
|
"parameter_count": len(tool_input) if isinstance(tool_input, dict) else 0,
|
|
155
156
|
"is_file_operation": tool_name
|
|
156
157
|
in ["Write", "Edit", "MultiEdit", "Read", "LS", "Glob"],
|
|
@@ -249,7 +250,7 @@ class EventHandlers:
|
|
|
249
250
|
"session_id": session_id,
|
|
250
251
|
"prompt": tool_input.get("prompt", ""),
|
|
251
252
|
"description": tool_input.get("description", ""),
|
|
252
|
-
"timestamp": datetime.now().isoformat(),
|
|
253
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
253
254
|
"hook_event_name": "SubagentStart", # For dashboard compatibility
|
|
254
255
|
}
|
|
255
256
|
self.hook_handler._emit_socketio_event(
|
|
@@ -277,18 +278,18 @@ class EventHandlers:
|
|
|
277
278
|
"session_id": session_id,
|
|
278
279
|
"delegation_context": {
|
|
279
280
|
"description": tool_input.get("description", ""),
|
|
280
|
-
"timestamp": datetime.now().isoformat(),
|
|
281
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
281
282
|
},
|
|
282
283
|
}
|
|
283
284
|
|
|
284
285
|
# Log the agent prompt asynchronously
|
|
285
286
|
try:
|
|
286
287
|
loop = asyncio.get_running_loop()
|
|
287
|
-
asyncio.create_task(
|
|
288
|
+
_task = asyncio.create_task(
|
|
288
289
|
log_manager.log_prompt(
|
|
289
290
|
f"agent_{agent_type}", prompt_content, metadata
|
|
290
291
|
)
|
|
291
|
-
)
|
|
292
|
+
) # Fire-and-forget logging (ephemeral hook process)
|
|
292
293
|
except RuntimeError:
|
|
293
294
|
# No running loop, create one
|
|
294
295
|
loop = asyncio.new_event_loop()
|
|
@@ -309,23 +310,25 @@ class EventHandlers:
|
|
|
309
310
|
"""Get git branch for the given directory with caching."""
|
|
310
311
|
# Use current working directory if not specified
|
|
311
312
|
if not working_dir:
|
|
312
|
-
working_dir =
|
|
313
|
+
working_dir = Path.cwd()
|
|
313
314
|
|
|
314
|
-
# Check cache first (cache for
|
|
315
|
-
|
|
315
|
+
# Check cache first (cache for 300 seconds = 5 minutes)
|
|
316
|
+
# WHY 5 minutes: Git branches rarely change during development sessions,
|
|
317
|
+
# reducing subprocess overhead significantly without staleness issues
|
|
318
|
+
current_time = datetime.now(timezone.utc).timestamp()
|
|
316
319
|
cache_key = working_dir
|
|
317
320
|
|
|
318
321
|
if (
|
|
319
322
|
cache_key in self.hook_handler._git_branch_cache
|
|
320
323
|
and cache_key in self.hook_handler._git_branch_cache_time
|
|
321
|
-
and current_time - self.hook_handler._git_branch_cache_time[cache_key] <
|
|
324
|
+
and current_time - self.hook_handler._git_branch_cache_time[cache_key] < 300
|
|
322
325
|
):
|
|
323
326
|
return self.hook_handler._git_branch_cache[cache_key]
|
|
324
327
|
|
|
325
328
|
# Try to get git branch
|
|
326
329
|
try:
|
|
327
330
|
# Change to the working directory temporarily
|
|
328
|
-
original_cwd =
|
|
331
|
+
original_cwd = Path.cwd()
|
|
329
332
|
os.chdir(working_dir)
|
|
330
333
|
|
|
331
334
|
# Run git command to get current branch
|
|
@@ -397,7 +400,7 @@ class EventHandlers:
|
|
|
397
400
|
"session_id": event.get("session_id", ""),
|
|
398
401
|
"working_directory": working_dir,
|
|
399
402
|
"git_branch": git_branch,
|
|
400
|
-
"timestamp": datetime.now().isoformat(),
|
|
403
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
401
404
|
"has_output": bool(result_data.get("output")),
|
|
402
405
|
"has_error": bool(result_data.get("error")),
|
|
403
406
|
"output_size": (
|
|
@@ -448,7 +451,7 @@ class EventHandlers:
|
|
|
448
451
|
"session_id": event.get("session_id", ""),
|
|
449
452
|
"working_directory": working_dir,
|
|
450
453
|
"git_branch": git_branch,
|
|
451
|
-
"timestamp": datetime.now().isoformat(),
|
|
454
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
452
455
|
"is_user_input_request": "input" in message.lower()
|
|
453
456
|
or "waiting" in message.lower(),
|
|
454
457
|
"is_error_notification": "error" in message.lower()
|
|
@@ -492,7 +495,7 @@ class EventHandlers:
|
|
|
492
495
|
"""Extract metadata from stop event."""
|
|
493
496
|
working_dir = event.get("cwd", "")
|
|
494
497
|
return {
|
|
495
|
-
"timestamp": datetime.now().isoformat(),
|
|
498
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
496
499
|
"working_directory": working_dir,
|
|
497
500
|
"git_branch": (
|
|
498
501
|
self._get_git_branch(working_dir) if working_dir else "Unknown"
|
|
@@ -639,7 +642,7 @@ class EventHandlers:
|
|
|
639
642
|
"has_error": reason in ["error", "timeout", "failed", "blocked"],
|
|
640
643
|
"working_directory": working_dir,
|
|
641
644
|
"git_branch": git_branch,
|
|
642
|
-
"timestamp": datetime.now().isoformat(),
|
|
645
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
643
646
|
"event_type": "subagent_stop",
|
|
644
647
|
"reason": reason,
|
|
645
648
|
"original_request_timestamp": request_info.get("timestamp"),
|
|
@@ -715,7 +718,7 @@ class EventHandlers:
|
|
|
715
718
|
"session_id": session_id,
|
|
716
719
|
"working_directory": working_dir,
|
|
717
720
|
"git_branch": git_branch,
|
|
718
|
-
"timestamp": datetime.now().isoformat(),
|
|
721
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
719
722
|
"contains_code": "```" in response_text,
|
|
720
723
|
"contains_json": "```json" in response_text,
|
|
721
724
|
"hook_event_name": "AssistantResponse", # Explicitly set for dashboard
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
This handler uses a service-oriented architecture with:
|
|
5
5
|
- StateManagerService: Manages state and delegation tracking
|
|
6
|
-
- ConnectionManagerService: Handles SocketIO
|
|
6
|
+
- ConnectionManagerService: Handles SocketIO connections with HTTP fallback
|
|
7
7
|
- SubagentResponseProcessor: Processes complex subagent responses
|
|
8
8
|
- DuplicateEventDetector: Detects and filters duplicate events
|
|
9
9
|
|
|
@@ -25,7 +25,7 @@ import signal
|
|
|
25
25
|
import subprocess
|
|
26
26
|
import sys
|
|
27
27
|
import threading
|
|
28
|
-
from datetime import datetime
|
|
28
|
+
from datetime import datetime, timezone
|
|
29
29
|
from typing import Optional, Tuple
|
|
30
30
|
|
|
31
31
|
# Import extracted modules with fallback for direct execution
|
|
@@ -73,19 +73,10 @@ DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
|
73
73
|
Conditional imports with graceful fallbacks for testing and modularity.
|
|
74
74
|
|
|
75
75
|
WHY conditional imports:
|
|
76
|
-
- EventBus is optional for basic hook functionality
|
|
77
76
|
- Tests may not have full environment setup
|
|
78
77
|
- Allows hooks to work in minimal configurations
|
|
79
78
|
- Graceful degradation when dependencies unavailable
|
|
80
79
|
"""
|
|
81
|
-
# Import EventBus availability flag for backward compatibility with tests
|
|
82
|
-
try:
|
|
83
|
-
from claude_mpm.services.event_bus import EventBus
|
|
84
|
-
|
|
85
|
-
EVENTBUS_AVAILABLE = True
|
|
86
|
-
except ImportError:
|
|
87
|
-
EVENTBUS_AVAILABLE = False
|
|
88
|
-
EventBus = None
|
|
89
80
|
|
|
90
81
|
# Import get_connection_pool for backward compatibility with tests
|
|
91
82
|
try:
|
|
@@ -241,7 +232,6 @@ class ClaudeHookHandler:
|
|
|
241
232
|
|
|
242
233
|
# Backward compatibility properties for tests
|
|
243
234
|
self.connection_pool = self.connection_manager.connection_pool
|
|
244
|
-
self.event_bus = self.connection_manager.event_bus
|
|
245
235
|
|
|
246
236
|
# Expose state manager properties for backward compatibility
|
|
247
237
|
self.active_delegations = self.state_manager.active_delegations
|
|
@@ -294,7 +284,7 @@ class ClaudeHookHandler:
|
|
|
294
284
|
if self.duplicate_detector.is_duplicate(event):
|
|
295
285
|
if DEBUG:
|
|
296
286
|
print(
|
|
297
|
-
f"[{datetime.now().isoformat()}] Skipping duplicate event: {event.get('hook_event_name', 'unknown')} (PID: {os.getpid()})",
|
|
287
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Skipping duplicate event: {event.get('hook_event_name', 'unknown')} (PID: {os.getpid()})",
|
|
298
288
|
file=sys.stderr,
|
|
299
289
|
)
|
|
300
290
|
# Still need to output continue for this invocation
|
|
@@ -307,7 +297,7 @@ class ClaudeHookHandler:
|
|
|
307
297
|
if DEBUG:
|
|
308
298
|
hook_type = event.get("hook_event_name", "unknown")
|
|
309
299
|
print(
|
|
310
|
-
f"\n[{datetime.now().isoformat()}] Processing hook event: {hook_type} (PID: {os.getpid()})",
|
|
300
|
+
f"\n[{datetime.now(timezone.utc).isoformat()}] Processing hook event: {hook_type} (PID: {os.getpid()})",
|
|
311
301
|
file=sys.stderr,
|
|
312
302
|
)
|
|
313
303
|
|
|
@@ -321,11 +311,12 @@ class ClaudeHookHandler:
|
|
|
321
311
|
)
|
|
322
312
|
|
|
323
313
|
# Route event to appropriate handler
|
|
324
|
-
|
|
314
|
+
# Handlers can optionally return modified input for PreToolUse events
|
|
315
|
+
modified_input = self._route_event(event)
|
|
325
316
|
|
|
326
317
|
# Always continue execution (only if not already sent)
|
|
327
318
|
if not _continue_sent:
|
|
328
|
-
self._continue_execution()
|
|
319
|
+
self._continue_execution(modified_input)
|
|
329
320
|
_continue_sent = True
|
|
330
321
|
|
|
331
322
|
except Exception:
|
|
@@ -386,7 +377,7 @@ class ClaudeHookHandler:
|
|
|
386
377
|
print(f"Error reading hook event: {e}", file=sys.stderr)
|
|
387
378
|
return None
|
|
388
379
|
|
|
389
|
-
def _route_event(self, event: dict) ->
|
|
380
|
+
def _route_event(self, event: dict) -> Optional[dict]:
|
|
390
381
|
"""
|
|
391
382
|
Route event to appropriate handler based on type.
|
|
392
383
|
|
|
@@ -395,6 +386,9 @@ class ClaudeHookHandler:
|
|
|
395
386
|
|
|
396
387
|
Args:
|
|
397
388
|
event: Hook event dictionary
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
Modified input for PreToolUse events (v2.0.30+), None otherwise
|
|
398
392
|
"""
|
|
399
393
|
# Try multiple field names for compatibility
|
|
400
394
|
hook_type = (
|
|
@@ -426,23 +420,36 @@ class ClaudeHookHandler:
|
|
|
426
420
|
handler = event_handlers.get(hook_type)
|
|
427
421
|
if handler:
|
|
428
422
|
try:
|
|
429
|
-
|
|
423
|
+
# Handlers can optionally return modified input
|
|
424
|
+
result = handler(event)
|
|
425
|
+
# Only PreToolUse handlers should return modified input
|
|
426
|
+
if hook_type == "PreToolUse" and result is not None:
|
|
427
|
+
return result
|
|
430
428
|
except Exception as e:
|
|
431
429
|
if DEBUG:
|
|
432
430
|
print(f"Error handling {hook_type}: {e}", file=sys.stderr)
|
|
433
431
|
|
|
432
|
+
return None
|
|
433
|
+
|
|
434
434
|
def handle_subagent_stop(self, event: dict):
|
|
435
435
|
"""Delegate subagent stop processing to the specialized processor."""
|
|
436
436
|
self.subagent_processor.process_subagent_stop(event)
|
|
437
437
|
|
|
438
|
-
def _continue_execution(self) -> None:
|
|
438
|
+
def _continue_execution(self, modified_input: Optional[dict] = None) -> None:
|
|
439
439
|
"""
|
|
440
|
-
Send continue action to Claude.
|
|
440
|
+
Send continue action to Claude with optional input modification.
|
|
441
441
|
|
|
442
442
|
WHY: Centralized response ensures consistent format
|
|
443
443
|
and makes it easier to add response modifications.
|
|
444
|
+
|
|
445
|
+
Args:
|
|
446
|
+
modified_input: Modified tool parameters for PreToolUse hooks (v2.0.30+)
|
|
444
447
|
"""
|
|
445
|
-
|
|
448
|
+
if modified_input is not None:
|
|
449
|
+
# Claude Code v2.0.30+ supports modifying PreToolUse tool inputs
|
|
450
|
+
print(json.dumps({"action": "continue", "tool_input": modified_input}))
|
|
451
|
+
else:
|
|
452
|
+
print(json.dumps({"action": "continue"}))
|
|
446
453
|
|
|
447
454
|
# Delegation methods for compatibility with event_handlers
|
|
448
455
|
def _track_delegation(self, session_id: str, agent_type: str, request_data=None):
|
|
@@ -471,7 +478,7 @@ class ClaudeHookHandler:
|
|
|
471
478
|
if hasattr(self, "connection_manager") and self.connection_manager:
|
|
472
479
|
try:
|
|
473
480
|
self.connection_manager.cleanup()
|
|
474
|
-
except:
|
|
481
|
+
except Exception:
|
|
475
482
|
pass # Ignore cleanup errors during destruction
|
|
476
483
|
|
|
477
484
|
|
|
@@ -37,7 +37,7 @@ find_claude_mpm() {
|
|
|
37
37
|
cmd_path=$(readlink -f "$cmd_path")
|
|
38
38
|
fi
|
|
39
39
|
# Extract the base directory (usually site-packages or venv)
|
|
40
|
-
local base_dir=$(python3 -c "import claude_mpm; import os; print(
|
|
40
|
+
local base_dir=$(python3 -c "import claude_mpm; import os; print(Path(os.path.dirname(claude_mpm.__file__).parent))" 2>/dev/null)
|
|
41
41
|
if [ -n "$base_dir" ]; then
|
|
42
42
|
echo "$base_dir"
|
|
43
43
|
return 0
|
|
@@ -71,7 +71,7 @@ try:
|
|
|
71
71
|
import claude_mpm
|
|
72
72
|
import os
|
|
73
73
|
# Get the package directory
|
|
74
|
-
pkg_dir =
|
|
74
|
+
pkg_dir = Path(claude_mpm.__file__).parent
|
|
75
75
|
# Check if we're in a development install (src directory)
|
|
76
76
|
if 'src' in pkg_dir:
|
|
77
77
|
# Go up to find the project root
|
|
@@ -81,11 +81,11 @@ try:
|
|
|
81
81
|
project_root = os.sep.join(parts[:src_idx])
|
|
82
82
|
print(project_root)
|
|
83
83
|
else:
|
|
84
|
-
print(
|
|
84
|
+
print(Path(os.path.dirname(pkg_dir).parent))
|
|
85
85
|
else:
|
|
86
86
|
# Installed package - just return the package location
|
|
87
|
-
print(
|
|
88
|
-
except:
|
|
87
|
+
print(Path(pkg_dir).parent)
|
|
88
|
+
except Exception:
|
|
89
89
|
pass
|
|
90
90
|
" 2>/dev/null)
|
|
91
91
|
|
|
@@ -99,7 +99,7 @@ except:
|
|
|
99
99
|
for path_dir in $PATH; do
|
|
100
100
|
if [ -f "$path_dir/claude-mpm" ]; then
|
|
101
101
|
# Found claude-mpm executable, try to find its package
|
|
102
|
-
local pkg_dir=$(cd "$path_dir" && python3 -c "import claude_mpm; import os; print(
|
|
102
|
+
local pkg_dir=$(cd "$path_dir" && python3 -c "import claude_mpm; import os; print(Path(os.path.dirname(claude_mpm.__file__).parent))" 2>/dev/null)
|
|
103
103
|
if [ -n "$pkg_dir" ]; then
|
|
104
104
|
echo "$pkg_dir"
|
|
105
105
|
return 0
|
|
@@ -192,6 +192,8 @@ main "$@"
|
|
|
192
192
|
|
|
193
193
|
# Minimum Claude Code version required for hook monitoring
|
|
194
194
|
MIN_CLAUDE_VERSION = "1.0.92"
|
|
195
|
+
# Minimum version for PreToolUse input modification support
|
|
196
|
+
MIN_PRETOOL_MODIFY_VERSION = "2.0.30"
|
|
195
197
|
|
|
196
198
|
def __init__(self):
|
|
197
199
|
"""Initialize the hook installer."""
|
|
@@ -292,6 +294,42 @@ main "$@"
|
|
|
292
294
|
|
|
293
295
|
return (True, f"Claude Code {version} is compatible with hook monitoring.")
|
|
294
296
|
|
|
297
|
+
def supports_pretool_modify(self) -> bool:
|
|
298
|
+
"""
|
|
299
|
+
Check if the installed Claude Code version supports PreToolUse input modification.
|
|
300
|
+
|
|
301
|
+
PreToolUse input modification was added in Claude Code v2.0.30.
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
True if version supports input modification, False otherwise
|
|
305
|
+
"""
|
|
306
|
+
version = self.get_claude_version()
|
|
307
|
+
|
|
308
|
+
if version is None:
|
|
309
|
+
return False
|
|
310
|
+
|
|
311
|
+
def parse_version(v: str) -> List[int]:
|
|
312
|
+
"""Parse semantic version string to list of integers."""
|
|
313
|
+
try:
|
|
314
|
+
return [int(x) for x in v.split(".")]
|
|
315
|
+
except (ValueError, AttributeError):
|
|
316
|
+
return [0]
|
|
317
|
+
|
|
318
|
+
current = parse_version(version)
|
|
319
|
+
required = parse_version(self.MIN_PRETOOL_MODIFY_VERSION)
|
|
320
|
+
|
|
321
|
+
# Compare versions
|
|
322
|
+
for i in range(max(len(current), len(required))):
|
|
323
|
+
curr_part = current[i] if i < len(current) else 0
|
|
324
|
+
req_part = required[i] if i < len(required) else 0
|
|
325
|
+
|
|
326
|
+
if curr_part < req_part:
|
|
327
|
+
return False
|
|
328
|
+
if curr_part > req_part:
|
|
329
|
+
return True
|
|
330
|
+
|
|
331
|
+
return True
|
|
332
|
+
|
|
295
333
|
def get_hook_script_path(self) -> Path:
|
|
296
334
|
"""Get the path to the hook handler script based on installation method.
|
|
297
335
|
|
|
@@ -339,8 +377,8 @@ main "$@"
|
|
|
339
377
|
|
|
340
378
|
# Make sure it's executable
|
|
341
379
|
if script_path.exists():
|
|
342
|
-
st =
|
|
343
|
-
|
|
380
|
+
st = Path(script_path).stat()
|
|
381
|
+
Path(script_path).chmod(st.st_mode | stat.S_IEXEC)
|
|
344
382
|
self._hook_script_path = script_path
|
|
345
383
|
return script_path
|
|
346
384
|
|
|
@@ -428,7 +466,7 @@ main "$@"
|
|
|
428
466
|
return
|
|
429
467
|
|
|
430
468
|
try:
|
|
431
|
-
with
|
|
469
|
+
with self.old_settings_file.open() as f:
|
|
432
470
|
old_settings = json.load(f)
|
|
433
471
|
|
|
434
472
|
# Remove hooks section if present
|
|
@@ -437,7 +475,7 @@ main "$@"
|
|
|
437
475
|
self.logger.info(f"Removing hooks from {self.old_settings_file}")
|
|
438
476
|
|
|
439
477
|
# Write back the cleaned settings
|
|
440
|
-
with
|
|
478
|
+
with self.old_settings_file.open("w") as f:
|
|
441
479
|
json.dump(old_settings, f, indent=2)
|
|
442
480
|
|
|
443
481
|
self.logger.info(f"Cleaned up hooks from {self.old_settings_file}")
|
|
@@ -450,7 +488,7 @@ main "$@"
|
|
|
450
488
|
|
|
451
489
|
# Load existing settings.json or create new
|
|
452
490
|
if self.settings_file.exists():
|
|
453
|
-
with
|
|
491
|
+
with self.settings_file.open() as f:
|
|
454
492
|
settings = json.load(f)
|
|
455
493
|
self.logger.info(f"Found existing Claude settings at {self.settings_file}")
|
|
456
494
|
else:
|
|
@@ -490,7 +528,7 @@ main "$@"
|
|
|
490
528
|
]
|
|
491
529
|
|
|
492
530
|
# Write settings to settings.json
|
|
493
|
-
with
|
|
531
|
+
with self.settings_file.open("w") as f:
|
|
494
532
|
json.dump(settings, f, indent=2)
|
|
495
533
|
|
|
496
534
|
self.logger.info(f"Updated Claude settings at {self.settings_file}")
|
|
@@ -564,7 +602,7 @@ main "$@"
|
|
|
564
602
|
issues.append(f"Claude settings file not found at {self.settings_file}")
|
|
565
603
|
else:
|
|
566
604
|
try:
|
|
567
|
-
with
|
|
605
|
+
with self.settings_file.open() as f:
|
|
568
606
|
settings = json.load(f)
|
|
569
607
|
|
|
570
608
|
if "hooks" not in settings:
|
|
@@ -588,9 +626,9 @@ main "$@"
|
|
|
588
626
|
issues.append(f"Invalid Claude settings JSON: {e}")
|
|
589
627
|
|
|
590
628
|
# Check if claude-mpm is accessible
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
629
|
+
import importlib.util
|
|
630
|
+
|
|
631
|
+
if importlib.util.find_spec("claude_mpm") is None:
|
|
594
632
|
issues.append("claude-mpm package not found in Python environment")
|
|
595
633
|
|
|
596
634
|
is_valid = len(issues) == 0
|
|
@@ -615,7 +653,7 @@ main "$@"
|
|
|
615
653
|
# Remove from Claude settings (both old and new locations)
|
|
616
654
|
for settings_path in [self.settings_file, self.old_settings_file]:
|
|
617
655
|
if settings_path.exists():
|
|
618
|
-
with open(
|
|
656
|
+
with settings_path.open() as f:
|
|
619
657
|
settings = json.load(f)
|
|
620
658
|
|
|
621
659
|
if "hooks" in settings:
|
|
@@ -655,7 +693,7 @@ main "$@"
|
|
|
655
693
|
del settings["hooks"]
|
|
656
694
|
|
|
657
695
|
# Write back settings
|
|
658
|
-
with open(
|
|
696
|
+
with settings_path.open("w") as f:
|
|
659
697
|
json.dump(settings, f, indent=2)
|
|
660
698
|
|
|
661
699
|
self.logger.info(f"Removed hooks from {settings_path}")
|
|
@@ -677,6 +715,7 @@ main "$@"
|
|
|
677
715
|
# Check version compatibility
|
|
678
716
|
claude_version = self.get_claude_version()
|
|
679
717
|
is_compatible, version_message = self.is_version_compatible()
|
|
718
|
+
pretool_modify_supported = self.supports_pretool_modify()
|
|
680
719
|
|
|
681
720
|
is_valid, issues = self.verify_hooks()
|
|
682
721
|
|
|
@@ -701,6 +740,12 @@ main "$@"
|
|
|
701
740
|
"version_compatible": is_compatible,
|
|
702
741
|
"version_message": version_message,
|
|
703
742
|
"deployment_type": "deployment-root", # New field to indicate new architecture
|
|
743
|
+
"pretool_modify_supported": pretool_modify_supported, # v2.0.30+ feature
|
|
744
|
+
"pretool_modify_message": (
|
|
745
|
+
f"PreToolUse input modification supported (v{claude_version})"
|
|
746
|
+
if pretool_modify_supported
|
|
747
|
+
else f"PreToolUse input modification requires Claude Code {self.MIN_PRETOOL_MODIFY_VERSION}+ (current: {claude_version or 'unknown'})"
|
|
748
|
+
),
|
|
704
749
|
}
|
|
705
750
|
|
|
706
751
|
# Check Claude settings for hook configuration
|
|
@@ -709,18 +754,18 @@ main "$@"
|
|
|
709
754
|
|
|
710
755
|
if self.settings_file.exists():
|
|
711
756
|
try:
|
|
712
|
-
with
|
|
757
|
+
with self.settings_file.open() as f:
|
|
713
758
|
settings = json.load(f)
|
|
714
759
|
if "hooks" in settings:
|
|
715
760
|
status["configured_events"] = list(settings["hooks"].keys())
|
|
716
761
|
configured_in_local = True
|
|
717
|
-
except:
|
|
762
|
+
except Exception:
|
|
718
763
|
pass
|
|
719
764
|
|
|
720
765
|
# Also check old settings file
|
|
721
766
|
if self.old_settings_file.exists():
|
|
722
767
|
try:
|
|
723
|
-
with
|
|
768
|
+
with self.old_settings_file.open() as f:
|
|
724
769
|
old_settings = json.load(f)
|
|
725
770
|
if "hooks" in old_settings:
|
|
726
771
|
status["old_file_has_hooks"] = True
|
|
@@ -728,7 +773,7 @@ main "$@"
|
|
|
728
773
|
status["warning"] = (
|
|
729
774
|
"Hooks found in settings.local.json but Claude Code reads from settings.json"
|
|
730
775
|
)
|
|
731
|
-
except:
|
|
776
|
+
except Exception:
|
|
732
777
|
pass
|
|
733
778
|
|
|
734
779
|
status["settings_location"] = (
|
|
@@ -7,7 +7,7 @@ including pre and post delegation hooks.
|
|
|
7
7
|
|
|
8
8
|
import os
|
|
9
9
|
import sys
|
|
10
|
-
from datetime import datetime
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
11
|
from typing import Optional
|
|
12
12
|
|
|
13
13
|
# Debug mode
|
|
@@ -122,7 +122,7 @@ class MemoryHookManager:
|
|
|
122
122
|
"session_id": session_id,
|
|
123
123
|
},
|
|
124
124
|
metadata={"source": "claude_hook_handler", "tool_name": "Task"},
|
|
125
|
-
timestamp=datetime.now().isoformat(),
|
|
125
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
126
126
|
session_id=session_id,
|
|
127
127
|
)
|
|
128
128
|
|
|
@@ -200,7 +200,7 @@ class MemoryHookManager:
|
|
|
200
200
|
"tool_name": "Task",
|
|
201
201
|
"duration_ms": event.get("duration_ms", 0),
|
|
202
202
|
},
|
|
203
|
-
timestamp=datetime.now().isoformat(),
|
|
203
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
204
204
|
session_id=session_id,
|
|
205
205
|
)
|
|
206
206
|
|
|
@@ -9,29 +9,29 @@ import json
|
|
|
9
9
|
import os
|
|
10
10
|
import re
|
|
11
11
|
import sys
|
|
12
|
-
from datetime import datetime
|
|
13
|
-
from
|
|
12
|
+
from datetime import datetime, timezone
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Optional
|
|
14
15
|
|
|
15
16
|
# Debug mode
|
|
16
17
|
DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
17
18
|
|
|
18
19
|
# Response tracking integration
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if DEBUG:
|
|
26
|
-
print(f"Response tracking not available: {e}", file=sys.stderr)
|
|
27
|
-
RESPONSE_TRACKING_AVAILABLE = False
|
|
20
|
+
# NOTE: ResponseTracker import moved to _initialize_response_tracking() for lazy loading
|
|
21
|
+
# This prevents unnecessary import of base_agent_loader and other heavy dependencies
|
|
22
|
+
# when hooks don't need response tracking
|
|
23
|
+
RESPONSE_TRACKING_AVAILABLE = (
|
|
24
|
+
True # Assume available, will check on actual initialization
|
|
25
|
+
)
|
|
28
26
|
|
|
29
27
|
|
|
30
28
|
class ResponseTrackingManager:
|
|
31
29
|
"""Manager for response tracking functionality."""
|
|
32
30
|
|
|
33
31
|
def __init__(self):
|
|
34
|
-
self.response_tracker: Optional[
|
|
32
|
+
self.response_tracker: Optional[Any] = (
|
|
33
|
+
None # Type hint changed to Any for lazy import
|
|
34
|
+
)
|
|
35
35
|
self.response_tracking_enabled = False
|
|
36
36
|
self.track_all_interactions = (
|
|
37
37
|
False # Track all Claude interactions, not just delegations
|
|
@@ -49,8 +49,14 @@ class ResponseTrackingManager:
|
|
|
49
49
|
|
|
50
50
|
DESIGN DECISION: Check configuration to allow enabling/disabling
|
|
51
51
|
response tracking without code changes.
|
|
52
|
+
|
|
53
|
+
NOTE: ResponseTracker is imported lazily here to avoid loading
|
|
54
|
+
base_agent_loader and other heavy dependencies unless actually needed.
|
|
52
55
|
"""
|
|
53
56
|
try:
|
|
57
|
+
# Lazy import of ResponseTracker to avoid unnecessary dependency loading
|
|
58
|
+
from claude_mpm.services.response_tracker import ResponseTracker
|
|
59
|
+
|
|
54
60
|
# Create configuration with optional config file using ConfigLoader
|
|
55
61
|
config_file = os.environ.get("CLAUDE_PM_CONFIG_FILE")
|
|
56
62
|
from claude_mpm.core.shared.config_loader import ConfigLoader, ConfigPattern
|
|
@@ -59,8 +65,8 @@ class ResponseTrackingManager:
|
|
|
59
65
|
if config_file:
|
|
60
66
|
# Use specific config file with ConfigLoader
|
|
61
67
|
pattern = ConfigPattern(
|
|
62
|
-
filenames=[
|
|
63
|
-
search_paths=[
|
|
68
|
+
filenames=[Path(config_file).name],
|
|
69
|
+
search_paths=[Path(config_file).parent],
|
|
64
70
|
env_prefix="CLAUDE_MPM_",
|
|
65
71
|
)
|
|
66
72
|
config = config_loader.load_config(
|
|
@@ -192,7 +198,7 @@ class ResponseTrackingManager:
|
|
|
192
198
|
"has_error": bool(event.get("error")),
|
|
193
199
|
"duration_ms": event.get("duration_ms"),
|
|
194
200
|
"working_directory": event.get("cwd", ""),
|
|
195
|
-
"timestamp": datetime.now().isoformat(),
|
|
201
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
196
202
|
"tool_name": "Task",
|
|
197
203
|
"original_request_timestamp": request_info.get("timestamp"),
|
|
198
204
|
}
|
|
@@ -262,7 +268,10 @@ class ResponseTrackingManager:
|
|
|
262
268
|
def track_stop_response(
|
|
263
269
|
self, event: dict, session_id: str, metadata: dict, pending_prompts: dict
|
|
264
270
|
):
|
|
265
|
-
"""Track response for stop events.
|
|
271
|
+
"""Track response for stop events.
|
|
272
|
+
|
|
273
|
+
Captures Claude API stop_reason and usage data for context management.
|
|
274
|
+
"""
|
|
266
275
|
if not (self.response_tracking_enabled and self.response_tracker):
|
|
267
276
|
return
|
|
268
277
|
|
|
@@ -288,6 +297,37 @@ class ResponseTrackingManager:
|
|
|
288
297
|
# Add prompt timestamp to metadata
|
|
289
298
|
metadata["prompt_timestamp"] = prompt_data.get("timestamp")
|
|
290
299
|
|
|
300
|
+
# Capture Claude API stop_reason if available
|
|
301
|
+
if "stop_reason" in event:
|
|
302
|
+
metadata["stop_reason"] = event["stop_reason"]
|
|
303
|
+
if DEBUG:
|
|
304
|
+
print(
|
|
305
|
+
f" - Captured stop_reason: {event['stop_reason']}",
|
|
306
|
+
file=sys.stderr,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
# Capture Claude API usage data if available
|
|
310
|
+
if "usage" in event:
|
|
311
|
+
usage_data = event["usage"]
|
|
312
|
+
metadata["usage"] = {
|
|
313
|
+
"input_tokens": usage_data.get("input_tokens", 0),
|
|
314
|
+
"output_tokens": usage_data.get("output_tokens", 0),
|
|
315
|
+
"cache_creation_input_tokens": usage_data.get(
|
|
316
|
+
"cache_creation_input_tokens", 0
|
|
317
|
+
),
|
|
318
|
+
"cache_read_input_tokens": usage_data.get(
|
|
319
|
+
"cache_read_input_tokens", 0
|
|
320
|
+
),
|
|
321
|
+
}
|
|
322
|
+
if DEBUG:
|
|
323
|
+
total_tokens = usage_data.get(
|
|
324
|
+
"input_tokens", 0
|
|
325
|
+
) + usage_data.get("output_tokens", 0)
|
|
326
|
+
print(
|
|
327
|
+
f" - Captured usage: {total_tokens} total tokens",
|
|
328
|
+
file=sys.stderr,
|
|
329
|
+
)
|
|
330
|
+
|
|
291
331
|
# Track the main Claude response
|
|
292
332
|
file_path = self.response_tracker.track_response(
|
|
293
333
|
agent_name="claude_main",
|
|
@@ -344,7 +384,7 @@ class ResponseTrackingManager:
|
|
|
344
384
|
|
|
345
385
|
# Track the response
|
|
346
386
|
metadata = {
|
|
347
|
-
"timestamp": datetime.now().isoformat(),
|
|
387
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
348
388
|
"prompt_timestamp": prompt_data.get("timestamp"),
|
|
349
389
|
"working_directory": prompt_data.get("working_directory", ""),
|
|
350
390
|
"event_type": "assistant_response",
|