claude-mpm 4.1.6__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 +431 -214
- 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/MEMORY.md +3 -0
- claude_mpm/agents/OUTPUT_STYLE.md +335 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -187
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/agents_metadata.py +57 -0
- 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/.claude-mpm/memories/README.md +17 -0
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +267 -18
- claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
- 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 +25 -9
- 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 +44 -10
- 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_20250826_014258_728.md +39 -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 +27 -8
- 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 +26 -6
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +47 -22
- 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 +243 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -363
- claude_mpm/cli/commands/__init__.py +8 -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 +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- 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 +488 -884
- 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 +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- 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 +168 -617
- 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 +195 -0
- 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/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +187 -3
- claude_mpm/cli/parsers/configure_parser.py +34 -15
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- 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 +311 -0
- 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/__init__.py +14 -0
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +122 -0
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +141 -0
- claude_mpm/commands/mpm-doctor.md +24 -0
- claude_mpm/commands/mpm-help.md +290 -0
- claude_mpm/commands/mpm-init.md +521 -0
- 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 +75 -0
- claude_mpm/commands/mpm-tickets.md +151 -0
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +21 -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 +36 -7
- claude_mpm/constants.py +27 -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 +103 -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 +323 -1491
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- 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 +100 -28
- 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 +118 -15
- 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 +116 -12
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/analysis_runner.py +455 -0
- 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 +2 -0
- 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 +2 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
- 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 +2 -0
- 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/activity.css +1958 -0
- claude_mpm/dashboard/static/css/dashboard.css +1413 -72
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
- 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 +2 -0
- 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 +1871 -0
- 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 +23 -13
- 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 -107
- claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
- 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 +68 -205
- claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
- claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
- claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
- claude_mpm/dashboard/static/js/connection-manager.js +1 -1
- claude_mpm/dashboard/static/js/dashboard.js +523 -622
- 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 +549 -62
- 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 +267 -9
- claude_mpm/experimental/__init__.py +10 -0
- 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 +209 -25
- claude_mpm/hooks/claude_hooks/installer.py +783 -0
- 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 +64 -49
- 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/schemas/__init__.py +12 -0
- claude_mpm/scripts/claude-hook-handler.sh +187 -0
- 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 +156 -396
- 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_config_provider.py +127 -27
- 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 +5 -6
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
- 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 +7 -7
- 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 +6 -5
- claude_mpm/services/cli/agent_dependency_service.py +1 -1
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +6 -5
- 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 -21
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +17 -9
- 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/cache_manager.py +1 -3
- 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 +37 -18
- claude_mpm/services/core/service_container.py +2 -2
- 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 +22 -24
- 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 +152 -13
- 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 +12 -12
- 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/monitoring.py +12 -12
- 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 +6 -6
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +8 -8
- 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/language_analyzer.py +3 -3
- claude_mpm/services/project/metrics_collector.py +7 -10
- 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 +74 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -0
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
- 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 -0
- 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 +131 -68
- claude_mpm/services/socketio/server/core.py +275 -22
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +99 -29
- 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/services/visualization/__init__.py +19 -0
- claude_mpm/services/visualization/mermaid_generator.py +938 -0
- 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/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- 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 +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- 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.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -237
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/agent-manager.md +0 -304
- claude_mpm/cli/commands/configure_tui.py +0 -1921
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- 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_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 -424
- claude_mpm/services/cli/socketio_manager.py +0 -498
- 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-4.1.6.dist-info/METADATA +0 -325
- claude_mpm-4.1.6.dist-info/RECORD +0 -550
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -11,7 +11,8 @@ import os
|
|
|
11
11
|
import subprocess
|
|
12
12
|
import time
|
|
13
13
|
from collections import deque
|
|
14
|
-
from datetime import datetime
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
|
+
from pathlib import Path
|
|
15
16
|
from typing import Optional
|
|
16
17
|
|
|
17
18
|
# Import constants for configuration
|
|
@@ -77,7 +78,7 @@ class StateManagerService:
|
|
|
77
78
|
|
|
78
79
|
if session_id and agent_type and agent_type != "unknown":
|
|
79
80
|
self.active_delegations[session_id] = agent_type
|
|
80
|
-
key = f"{session_id}:{datetime.now().timestamp()}"
|
|
81
|
+
key = f"{session_id}:{datetime.now(timezone.utc).timestamp()}"
|
|
81
82
|
self.delegation_history.append((key, agent_type))
|
|
82
83
|
|
|
83
84
|
# Store request data for response tracking correlation
|
|
@@ -85,7 +86,7 @@ class StateManagerService:
|
|
|
85
86
|
self.delegation_requests[session_id] = {
|
|
86
87
|
"agent_type": agent_type,
|
|
87
88
|
"request": request_data,
|
|
88
|
-
"timestamp": datetime.now().isoformat(),
|
|
89
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
89
90
|
}
|
|
90
91
|
if DEBUG:
|
|
91
92
|
import sys
|
|
@@ -100,7 +101,7 @@ class StateManagerService:
|
|
|
100
101
|
)
|
|
101
102
|
|
|
102
103
|
# Clean up old delegations (older than 5 minutes)
|
|
103
|
-
cutoff_time = datetime.now().timestamp() - 300
|
|
104
|
+
cutoff_time = datetime.now(timezone.utc).timestamp() - 300
|
|
104
105
|
keys_to_remove = []
|
|
105
106
|
for sid in list(self.active_delegations.keys()):
|
|
106
107
|
# Check if this is an old entry by looking in history
|
|
@@ -136,7 +137,7 @@ class StateManagerService:
|
|
|
136
137
|
|
|
137
138
|
def cleanup_old_entries(self):
|
|
138
139
|
"""Clean up old entries to prevent memory growth."""
|
|
139
|
-
datetime.now().timestamp() - self.MAX_CACHE_AGE_SECONDS
|
|
140
|
+
datetime.now(timezone.utc).timestamp() - self.MAX_CACHE_AGE_SECONDS
|
|
140
141
|
|
|
141
142
|
# Clean up delegation tracking dictionaries
|
|
142
143
|
for storage in [self.active_delegations, self.delegation_requests]:
|
|
@@ -158,7 +159,8 @@ class StateManagerService:
|
|
|
158
159
|
expired_keys = [
|
|
159
160
|
key
|
|
160
161
|
for key, cache_time in self._git_branch_cache_time.items()
|
|
161
|
-
if datetime.now().timestamp() - cache_time
|
|
162
|
+
if datetime.now(timezone.utc).timestamp() - cache_time
|
|
163
|
+
> self.MAX_CACHE_AGE_SECONDS
|
|
162
164
|
]
|
|
163
165
|
for key in expired_keys:
|
|
164
166
|
self._git_branch_cache.pop(key, None)
|
|
@@ -175,10 +177,10 @@ class StateManagerService:
|
|
|
175
177
|
"""
|
|
176
178
|
# Use current working directory if not specified
|
|
177
179
|
if not working_dir:
|
|
178
|
-
working_dir =
|
|
180
|
+
working_dir = Path.cwd()
|
|
179
181
|
|
|
180
182
|
# Check cache first (cache for 30 seconds)
|
|
181
|
-
current_time = datetime.now().timestamp()
|
|
183
|
+
current_time = datetime.now(timezone.utc).timestamp()
|
|
182
184
|
cache_key = working_dir
|
|
183
185
|
|
|
184
186
|
if (
|
|
@@ -191,7 +193,7 @@ class StateManagerService:
|
|
|
191
193
|
# Try to get git branch
|
|
192
194
|
try:
|
|
193
195
|
# Change to the working directory temporarily
|
|
194
|
-
original_cwd =
|
|
196
|
+
original_cwd = Path.cwd()
|
|
195
197
|
os.chdir(working_dir)
|
|
196
198
|
|
|
197
199
|
# Run git command to get current branch
|
|
@@ -11,7 +11,7 @@ import json
|
|
|
11
11
|
import os
|
|
12
12
|
import re
|
|
13
13
|
import sys
|
|
14
|
-
from datetime import datetime
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
15
|
from typing import Optional, Tuple
|
|
16
16
|
|
|
17
17
|
# Debug mode is enabled by default for better visibility into hook processing
|
|
@@ -272,7 +272,7 @@ class SubagentResponseProcessor:
|
|
|
272
272
|
"duration_ms": event.get("duration_ms"),
|
|
273
273
|
"working_directory": working_dir,
|
|
274
274
|
"git_branch": git_branch,
|
|
275
|
-
"timestamp": datetime.now().isoformat(),
|
|
275
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
276
276
|
"event_type": "subagent_stop",
|
|
277
277
|
"reason": reason,
|
|
278
278
|
"original_request_timestamp": request_info.get("timestamp"),
|
|
@@ -347,7 +347,7 @@ class SubagentResponseProcessor:
|
|
|
347
347
|
"session_id": session_id,
|
|
348
348
|
"working_directory": working_dir,
|
|
349
349
|
"git_branch": git_branch,
|
|
350
|
-
"timestamp": datetime.now().isoformat(),
|
|
350
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
351
351
|
"is_successful_completion": reason in ["completed", "finished", "done"],
|
|
352
352
|
"is_error_termination": reason in ["error", "timeout", "failed", "blocked"],
|
|
353
353
|
"is_delegation_related": agent_type
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Failure-Learning Hook System
|
|
4
|
+
=============================
|
|
5
|
+
|
|
6
|
+
Automatic learning extraction from failure-fix cycles.
|
|
7
|
+
|
|
8
|
+
WHY: When tasks fail and agents fix them, valuable knowledge is created. This
|
|
9
|
+
hook system automatically captures failures, detects fixes, and extracts learnings
|
|
10
|
+
without requiring manual intervention.
|
|
11
|
+
|
|
12
|
+
Components:
|
|
13
|
+
- FailureDetectionHook (priority 85): Detects task failures from tool outputs
|
|
14
|
+
- FixDetectionHook (priority 87): Matches successful executions with failures
|
|
15
|
+
- LearningExtractionHook (priority 89): Synthesizes and persists learnings
|
|
16
|
+
|
|
17
|
+
Integration:
|
|
18
|
+
The hooks work together as a chain:
|
|
19
|
+
1. Tool executes and fails → FailureDetectionHook records failure
|
|
20
|
+
2. User or agent makes changes
|
|
21
|
+
3. Tool executes and succeeds → FixDetectionHook detects fix
|
|
22
|
+
4. Fix matched with failure → LearningExtractionHook creates learning
|
|
23
|
+
5. Learning written to agent memory file
|
|
24
|
+
|
|
25
|
+
Usage:
|
|
26
|
+
from claude_mpm.hooks.failure_learning import (
|
|
27
|
+
get_failure_detection_hook,
|
|
28
|
+
get_fix_detection_hook,
|
|
29
|
+
get_learning_extraction_hook,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Register hooks with hook service
|
|
33
|
+
hook_service.register_hook(get_failure_detection_hook())
|
|
34
|
+
hook_service.register_hook(get_fix_detection_hook())
|
|
35
|
+
hook_service.register_hook(get_learning_extraction_hook())
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
from .failure_detection_hook import (
|
|
39
|
+
FailureDetectionHook,
|
|
40
|
+
get_failure_detection_hook,
|
|
41
|
+
)
|
|
42
|
+
from .fix_detection_hook import (
|
|
43
|
+
FixDetectionHook,
|
|
44
|
+
get_fix_detection_hook,
|
|
45
|
+
)
|
|
46
|
+
from .learning_extraction_hook import (
|
|
47
|
+
LearningExtractionHook,
|
|
48
|
+
get_learning_extraction_hook,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
__all__ = [
|
|
52
|
+
# Hooks
|
|
53
|
+
"FailureDetectionHook",
|
|
54
|
+
"FixDetectionHook",
|
|
55
|
+
"LearningExtractionHook",
|
|
56
|
+
# Factory functions
|
|
57
|
+
"get_failure_detection_hook",
|
|
58
|
+
"get_fix_detection_hook",
|
|
59
|
+
"get_learning_extraction_hook",
|
|
60
|
+
]
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Failure Detection Hook
|
|
4
|
+
======================
|
|
5
|
+
|
|
6
|
+
Detects task failures from tool outputs and registers them with the FailureTracker.
|
|
7
|
+
|
|
8
|
+
WHY: Failures are the first step in the failure-learning cycle. By detecting
|
|
9
|
+
failures early, we can match them with fixes later and extract valuable learnings.
|
|
10
|
+
|
|
11
|
+
DESIGN DECISION: This hook runs after tool execution (priority=85) to inspect
|
|
12
|
+
tool outputs for failure patterns. It integrates with the PostDelegationHook
|
|
13
|
+
lifecycle to access tool execution results.
|
|
14
|
+
|
|
15
|
+
Integration points:
|
|
16
|
+
- Monitors post_tool events for Bash, NotebookEdit, and other execution tools
|
|
17
|
+
- Extracts error messages, exceptions, and test failures
|
|
18
|
+
- Registers failures with FailureTracker for fix matching
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import logging
|
|
22
|
+
from typing import Any, Dict
|
|
23
|
+
|
|
24
|
+
from claude_mpm.hooks.base_hook import (
|
|
25
|
+
BaseHook,
|
|
26
|
+
HookContext,
|
|
27
|
+
HookResult,
|
|
28
|
+
HookType,
|
|
29
|
+
)
|
|
30
|
+
from claude_mpm.services.memory.failure_tracker import get_failure_tracker
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class FailureDetectionHook(BaseHook):
|
|
36
|
+
"""Hook that detects and tracks task failures.
|
|
37
|
+
|
|
38
|
+
WHY: Automatically captures failures without requiring manual tracking.
|
|
39
|
+
Runs after tool execution to inspect outputs and detect error patterns.
|
|
40
|
+
|
|
41
|
+
DESIGN DECISION: Priority 85 ensures this runs after tool execution but
|
|
42
|
+
before fix detection and learning extraction. This ordering is critical
|
|
43
|
+
for the failure-learning cycle.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
# Tools to monitor for failures
|
|
47
|
+
MONITORED_TOOLS = [
|
|
48
|
+
"Bash", # Command execution
|
|
49
|
+
"NotebookEdit", # Jupyter notebook execution
|
|
50
|
+
"Task", # Subagent delegation
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
def __init__(self):
|
|
54
|
+
"""Initialize the failure detection hook."""
|
|
55
|
+
super().__init__(
|
|
56
|
+
name="failure_detection",
|
|
57
|
+
priority=85, # After tool execution, before fix detection
|
|
58
|
+
)
|
|
59
|
+
self.tracker = get_failure_tracker()
|
|
60
|
+
|
|
61
|
+
def execute(self, context: HookContext) -> HookResult:
|
|
62
|
+
"""Execute failure detection on tool output.
|
|
63
|
+
|
|
64
|
+
WHY: Inspects tool execution results to identify failures. When a failure
|
|
65
|
+
is detected, it's registered with the FailureTracker for later matching
|
|
66
|
+
with fixes.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
context: Hook context containing tool execution data
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
HookResult with detection results
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
# Extract tool execution data
|
|
76
|
+
tool_name = context.data.get("tool_name")
|
|
77
|
+
tool_output = self._extract_tool_output(context.data)
|
|
78
|
+
exit_code = context.data.get("exit_code", 0)
|
|
79
|
+
|
|
80
|
+
# Only process monitored tools
|
|
81
|
+
if tool_name not in self.MONITORED_TOOLS:
|
|
82
|
+
return HookResult(success=True, modified=False)
|
|
83
|
+
|
|
84
|
+
# Skip if tool succeeded
|
|
85
|
+
if exit_code == 0 and not self._contains_failure_indicators(tool_output):
|
|
86
|
+
return HookResult(success=True, modified=False)
|
|
87
|
+
|
|
88
|
+
# Detect failure
|
|
89
|
+
failure_context = self._build_failure_context(context)
|
|
90
|
+
failure = self.tracker.detect_failure(
|
|
91
|
+
tool_name=tool_name, tool_output=tool_output, context=failure_context
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
if failure:
|
|
95
|
+
logger.info(
|
|
96
|
+
f"Failure detected: {failure.task_type} - "
|
|
97
|
+
f"{failure.error_message[:50]}..."
|
|
98
|
+
)
|
|
99
|
+
return HookResult(
|
|
100
|
+
success=True,
|
|
101
|
+
modified=False,
|
|
102
|
+
metadata={"failure_detected": True, "failure_id": failure.task_id},
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
return HookResult(success=True, modified=False)
|
|
106
|
+
|
|
107
|
+
except Exception as e:
|
|
108
|
+
logger.error(f"Error in failure detection hook: {e}", exc_info=True)
|
|
109
|
+
return HookResult(success=False, error=str(e), modified=False)
|
|
110
|
+
|
|
111
|
+
def validate(self, context: HookContext) -> bool:
|
|
112
|
+
"""Validate if this hook should run for the given context.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
context: Hook context to validate
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
True if hook should execute
|
|
119
|
+
"""
|
|
120
|
+
if not super().validate(context):
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
# Run for POST_DELEGATION events (after tool execution)
|
|
124
|
+
if context.hook_type != HookType.POST_DELEGATION:
|
|
125
|
+
return False
|
|
126
|
+
|
|
127
|
+
# Must have tool execution data
|
|
128
|
+
return "tool_name" in context.data
|
|
129
|
+
|
|
130
|
+
def _extract_tool_output(self, data: Dict[str, Any]) -> str:
|
|
131
|
+
"""Extract tool output from event data.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
data: Event data dictionary
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Tool output string
|
|
138
|
+
"""
|
|
139
|
+
# Try various output fields
|
|
140
|
+
output = (
|
|
141
|
+
data.get("output")
|
|
142
|
+
or data.get("result")
|
|
143
|
+
or data.get("error_output")
|
|
144
|
+
or data.get("stderr")
|
|
145
|
+
or ""
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Handle nested result structures
|
|
149
|
+
if isinstance(output, dict):
|
|
150
|
+
output = (
|
|
151
|
+
output.get("output")
|
|
152
|
+
or output.get("content")
|
|
153
|
+
or output.get("error")
|
|
154
|
+
or str(output)
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
return str(output) if output else ""
|
|
158
|
+
|
|
159
|
+
def _contains_failure_indicators(self, output: str) -> bool:
|
|
160
|
+
"""Check if output contains failure indicators even if exit_code is 0.
|
|
161
|
+
|
|
162
|
+
WHY: Some tools return 0 exit code but still report failures in output
|
|
163
|
+
(e.g., test runners that catch exceptions).
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
output: Tool output
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
True if failure indicators found
|
|
170
|
+
"""
|
|
171
|
+
if not output:
|
|
172
|
+
return False
|
|
173
|
+
|
|
174
|
+
failure_keywords = [
|
|
175
|
+
"error:",
|
|
176
|
+
"exception:",
|
|
177
|
+
"failed",
|
|
178
|
+
"failure",
|
|
179
|
+
"traceback",
|
|
180
|
+
"✗",
|
|
181
|
+
"❌",
|
|
182
|
+
]
|
|
183
|
+
|
|
184
|
+
output_lower = output.lower()
|
|
185
|
+
return any(keyword in output_lower for keyword in failure_keywords)
|
|
186
|
+
|
|
187
|
+
def _build_failure_context(self, context: HookContext) -> Dict[str, str]:
|
|
188
|
+
"""Build context dictionary for failure event.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
context: Hook context
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
Context dictionary with agent, session, and other info
|
|
195
|
+
"""
|
|
196
|
+
failure_context = {}
|
|
197
|
+
|
|
198
|
+
# Extract relevant context fields
|
|
199
|
+
if context.session_id:
|
|
200
|
+
failure_context["session_id"] = context.session_id
|
|
201
|
+
|
|
202
|
+
# Extract agent info from data or metadata
|
|
203
|
+
agent_type = (
|
|
204
|
+
context.data.get("agent_type")
|
|
205
|
+
or context.data.get("subagent_type")
|
|
206
|
+
or context.metadata.get("agent_type")
|
|
207
|
+
)
|
|
208
|
+
if agent_type:
|
|
209
|
+
failure_context["agent_type"] = agent_type
|
|
210
|
+
|
|
211
|
+
# Extract command/script info for Bash tool
|
|
212
|
+
if context.data.get("tool_name") == "Bash":
|
|
213
|
+
command = context.data.get("command") or context.data.get(
|
|
214
|
+
"tool_input", {}
|
|
215
|
+
).get("command")
|
|
216
|
+
if command:
|
|
217
|
+
failure_context["command"] = command
|
|
218
|
+
|
|
219
|
+
# Extract working directory
|
|
220
|
+
working_dir = context.data.get("working_directory") or context.data.get("cwd")
|
|
221
|
+
if working_dir:
|
|
222
|
+
failure_context["working_dir"] = working_dir
|
|
223
|
+
|
|
224
|
+
return failure_context
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def get_failure_detection_hook() -> FailureDetectionHook:
|
|
228
|
+
"""Factory function to create failure detection hook.
|
|
229
|
+
|
|
230
|
+
WHY: Provides consistent hook creation pattern used throughout the framework.
|
|
231
|
+
|
|
232
|
+
Returns:
|
|
233
|
+
Configured FailureDetectionHook instance
|
|
234
|
+
"""
|
|
235
|
+
return FailureDetectionHook()
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Fix Detection Hook
|
|
4
|
+
==================
|
|
5
|
+
|
|
6
|
+
Detects when previously failed tasks succeed, indicating a fix has been applied.
|
|
7
|
+
|
|
8
|
+
WHY: Detecting fixes is the second step in the failure-learning cycle. When a
|
|
9
|
+
task that previously failed now succeeds, we know a fix was applied. Matching
|
|
10
|
+
fixes with failures creates the foundation for learning extraction.
|
|
11
|
+
|
|
12
|
+
DESIGN DECISION: This hook runs after failure detection (priority=87) to check
|
|
13
|
+
if successful tool executions resolve previous failures. Uses the FailureTracker
|
|
14
|
+
to match fixes with failures.
|
|
15
|
+
|
|
16
|
+
Integration points:
|
|
17
|
+
- Monitors successful tool executions (exit_code=0)
|
|
18
|
+
- Matches with previously detected failures by task type
|
|
19
|
+
- Marks failures as fixed in FailureTracker
|
|
20
|
+
- Triggers learning extraction for failure-fix pairs
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
import logging
|
|
24
|
+
from typing import Any, Dict
|
|
25
|
+
|
|
26
|
+
from claude_mpm.hooks.base_hook import (
|
|
27
|
+
BaseHook,
|
|
28
|
+
HookContext,
|
|
29
|
+
HookResult,
|
|
30
|
+
HookType,
|
|
31
|
+
)
|
|
32
|
+
from claude_mpm.services.memory.failure_tracker import get_failure_tracker
|
|
33
|
+
|
|
34
|
+
logger = logging.getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class FixDetectionHook(BaseHook):
|
|
38
|
+
"""Hook that detects when failures are fixed.
|
|
39
|
+
|
|
40
|
+
WHY: Automatically matches successful executions with previous failures.
|
|
41
|
+
This enables automatic learning extraction without manual intervention.
|
|
42
|
+
|
|
43
|
+
DESIGN DECISION: Priority 87 ensures this runs after failure detection
|
|
44
|
+
but before learning extraction. The sequencing is critical:
|
|
45
|
+
1. Failure detection (85)
|
|
46
|
+
2. Fix detection (87)
|
|
47
|
+
3. Learning extraction (89)
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
# Tools to monitor for fixes
|
|
51
|
+
MONITORED_TOOLS = [
|
|
52
|
+
"Bash", # Command execution
|
|
53
|
+
"NotebookEdit", # Jupyter notebook execution
|
|
54
|
+
"Task", # Subagent delegation
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
def __init__(self):
|
|
58
|
+
"""Initialize the fix detection hook."""
|
|
59
|
+
super().__init__(
|
|
60
|
+
name="fix_detection",
|
|
61
|
+
priority=87, # After failure detection, before learning extraction
|
|
62
|
+
)
|
|
63
|
+
self.tracker = get_failure_tracker()
|
|
64
|
+
|
|
65
|
+
def execute(self, context: HookContext) -> HookResult:
|
|
66
|
+
"""Execute fix detection on successful tool execution.
|
|
67
|
+
|
|
68
|
+
WHY: When a tool succeeds, check if it fixes a previous failure.
|
|
69
|
+
This creates failure-fix pairs that can be used for learning extraction.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
context: Hook context containing tool execution data
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
HookResult with detection results
|
|
76
|
+
"""
|
|
77
|
+
try:
|
|
78
|
+
# Extract tool execution data
|
|
79
|
+
tool_name = context.data.get("tool_name")
|
|
80
|
+
exit_code = context.data.get("exit_code", 0)
|
|
81
|
+
|
|
82
|
+
# Only process monitored tools
|
|
83
|
+
if tool_name not in self.MONITORED_TOOLS:
|
|
84
|
+
return HookResult(success=True, modified=False)
|
|
85
|
+
|
|
86
|
+
# Only process successful executions
|
|
87
|
+
if exit_code != 0:
|
|
88
|
+
return HookResult(success=True, modified=False)
|
|
89
|
+
|
|
90
|
+
# Check if there are any unfixed failures to potentially match
|
|
91
|
+
unfixed_failures = self.tracker.get_unfixed_failures()
|
|
92
|
+
if not unfixed_failures:
|
|
93
|
+
# No failures to fix, skip
|
|
94
|
+
return HookResult(success=True, modified=False)
|
|
95
|
+
|
|
96
|
+
# Attempt to detect a fix
|
|
97
|
+
tool_output = self._extract_tool_output(context.data)
|
|
98
|
+
fix_context = self._build_fix_context(context)
|
|
99
|
+
|
|
100
|
+
fix_result = self.tracker.detect_fix(
|
|
101
|
+
tool_name=tool_name,
|
|
102
|
+
tool_output=tool_output,
|
|
103
|
+
exit_code=exit_code,
|
|
104
|
+
context=fix_context,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
if fix_result:
|
|
108
|
+
fix_event, failure_event = fix_result
|
|
109
|
+
logger.info(
|
|
110
|
+
f"Fix detected: {failure_event.task_type} - "
|
|
111
|
+
f"resolved failure {failure_event.task_id}"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Store fix info in metadata for learning extraction hook
|
|
115
|
+
return HookResult(
|
|
116
|
+
success=True,
|
|
117
|
+
modified=False,
|
|
118
|
+
metadata={
|
|
119
|
+
"fix_detected": True,
|
|
120
|
+
"failure_id": failure_event.task_id,
|
|
121
|
+
"fix_event": fix_event,
|
|
122
|
+
"failure_event": failure_event,
|
|
123
|
+
},
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
return HookResult(success=True, modified=False)
|
|
127
|
+
|
|
128
|
+
except Exception as e:
|
|
129
|
+
logger.error(f"Error in fix detection hook: {e}", exc_info=True)
|
|
130
|
+
return HookResult(success=False, error=str(e), modified=False)
|
|
131
|
+
|
|
132
|
+
def validate(self, context: HookContext) -> bool:
|
|
133
|
+
"""Validate if this hook should run for the given context.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
context: Hook context to validate
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
True if hook should execute
|
|
140
|
+
"""
|
|
141
|
+
if not super().validate(context):
|
|
142
|
+
return False
|
|
143
|
+
|
|
144
|
+
# Run for POST_DELEGATION events (after tool execution)
|
|
145
|
+
if context.hook_type != HookType.POST_DELEGATION:
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
# Must have tool execution data
|
|
149
|
+
return "tool_name" in context.data
|
|
150
|
+
|
|
151
|
+
def _extract_tool_output(self, data: Dict[str, Any]) -> str:
|
|
152
|
+
"""Extract tool output from event data.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
data: Event data dictionary
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Tool output string
|
|
159
|
+
"""
|
|
160
|
+
# Try various output fields
|
|
161
|
+
output = data.get("output") or data.get("result") or data.get("stdout") or ""
|
|
162
|
+
|
|
163
|
+
# Handle nested result structures
|
|
164
|
+
if isinstance(output, dict):
|
|
165
|
+
output = output.get("output") or output.get("content") or str(output)
|
|
166
|
+
|
|
167
|
+
return str(output) if output else ""
|
|
168
|
+
|
|
169
|
+
def _build_fix_context(self, context: HookContext) -> Dict[str, str]:
|
|
170
|
+
"""Build context dictionary for fix event.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
context: Hook context
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Context dictionary with agent, session, and other info
|
|
177
|
+
"""
|
|
178
|
+
fix_context = {}
|
|
179
|
+
|
|
180
|
+
# Extract relevant context fields
|
|
181
|
+
if context.session_id:
|
|
182
|
+
fix_context["session_id"] = context.session_id
|
|
183
|
+
|
|
184
|
+
# Extract agent info
|
|
185
|
+
agent_type = (
|
|
186
|
+
context.data.get("agent_type")
|
|
187
|
+
or context.data.get("subagent_type")
|
|
188
|
+
or context.metadata.get("agent_type")
|
|
189
|
+
)
|
|
190
|
+
if agent_type:
|
|
191
|
+
fix_context["agent_type"] = agent_type
|
|
192
|
+
|
|
193
|
+
# Extract command/script info for Bash tool
|
|
194
|
+
if context.data.get("tool_name") == "Bash":
|
|
195
|
+
command = context.data.get("command") or context.data.get(
|
|
196
|
+
"tool_input", {}
|
|
197
|
+
).get("command")
|
|
198
|
+
if command:
|
|
199
|
+
fix_context["command"] = command
|
|
200
|
+
|
|
201
|
+
# Extract working directory
|
|
202
|
+
working_dir = context.data.get("working_directory") or context.data.get("cwd")
|
|
203
|
+
if working_dir:
|
|
204
|
+
fix_context["working_dir"] = working_dir
|
|
205
|
+
|
|
206
|
+
return fix_context
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def get_fix_detection_hook() -> FixDetectionHook:
|
|
210
|
+
"""Factory function to create fix detection hook.
|
|
211
|
+
|
|
212
|
+
WHY: Provides consistent hook creation pattern used throughout the framework.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
Configured FixDetectionHook instance
|
|
216
|
+
"""
|
|
217
|
+
return FixDetectionHook()
|