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
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Kuzu-Memory Pre-Delegation Enrichment Hook
|
|
3
|
+
==========================================
|
|
4
|
+
|
|
5
|
+
Enriches agent delegation context with relevant memories from kuzu-memory
|
|
6
|
+
before the agent receives the task. This is the READ side of bidirectional
|
|
7
|
+
enrichment.
|
|
8
|
+
|
|
9
|
+
WHY: Agents need access to relevant historical knowledge when performing tasks.
|
|
10
|
+
This hook retrieves memories from kuzu-memory and injects them into the
|
|
11
|
+
delegation context.
|
|
12
|
+
|
|
13
|
+
DESIGN DECISIONS:
|
|
14
|
+
- Priority 10 to run early, before other context modifications
|
|
15
|
+
- Reuses KuzuMemoryHook's retrieval methods for consistency
|
|
16
|
+
- Injects memories as a dedicated section in agent context
|
|
17
|
+
- Falls back gracefully if kuzu-memory is not available
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import logging
|
|
21
|
+
from typing import Any, Dict, Optional
|
|
22
|
+
|
|
23
|
+
from claude_mpm.hooks.base_hook import HookContext, HookResult, PreDelegationHook
|
|
24
|
+
from claude_mpm.hooks.kuzu_memory_hook import get_kuzu_memory_hook
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class KuzuEnrichmentHook(PreDelegationHook):
|
|
30
|
+
"""
|
|
31
|
+
Hook that enriches agent delegation context with kuzu-memory.
|
|
32
|
+
|
|
33
|
+
This hook:
|
|
34
|
+
1. Extracts the task/prompt from delegation context
|
|
35
|
+
2. Retrieves relevant memories from kuzu-memory
|
|
36
|
+
3. Injects memories into agent context
|
|
37
|
+
4. Formats memories for optimal agent understanding
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self):
|
|
41
|
+
"""Initialize the kuzu-memory enrichment hook."""
|
|
42
|
+
super().__init__(name="kuzu_memory_enrichment", priority=10)
|
|
43
|
+
|
|
44
|
+
# Reuse the kuzu-memory hook instance for retrieval
|
|
45
|
+
self.kuzu_hook = get_kuzu_memory_hook()
|
|
46
|
+
self.enabled = self.kuzu_hook.enabled
|
|
47
|
+
|
|
48
|
+
if not self.enabled:
|
|
49
|
+
logger.info(
|
|
50
|
+
"Kuzu-memory enrichment hook disabled (kuzu-memory not available)"
|
|
51
|
+
)
|
|
52
|
+
else:
|
|
53
|
+
logger.info("Kuzu-memory enrichment hook enabled")
|
|
54
|
+
|
|
55
|
+
def validate(self, context: HookContext) -> bool:
|
|
56
|
+
"""
|
|
57
|
+
Validate if hook should process this context.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
context: Hook context to validate
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
True if hook should execute
|
|
64
|
+
"""
|
|
65
|
+
if not self.enabled:
|
|
66
|
+
return False
|
|
67
|
+
|
|
68
|
+
# Check base validation (enabled, correct hook type, has agent)
|
|
69
|
+
if not super().validate(context):
|
|
70
|
+
return False
|
|
71
|
+
|
|
72
|
+
# Must have agent and context data
|
|
73
|
+
if not context.data.get("agent"):
|
|
74
|
+
return False
|
|
75
|
+
|
|
76
|
+
return True
|
|
77
|
+
|
|
78
|
+
def execute(self, context: HookContext) -> HookResult:
|
|
79
|
+
"""
|
|
80
|
+
Enrich delegation context with relevant memories.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
context: Hook context containing delegation data
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
HookResult with enriched context
|
|
87
|
+
"""
|
|
88
|
+
if not self.enabled:
|
|
89
|
+
return HookResult(success=True, data=context.data, modified=False)
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
# Extract query for memory retrieval
|
|
93
|
+
query = self._extract_query_from_context(context.data)
|
|
94
|
+
|
|
95
|
+
if not query:
|
|
96
|
+
logger.debug("No query extracted from context for memory retrieval")
|
|
97
|
+
return HookResult(success=True, data=context.data, modified=False)
|
|
98
|
+
|
|
99
|
+
# Retrieve relevant memories
|
|
100
|
+
memories = self.kuzu_hook._retrieve_memories(query)
|
|
101
|
+
|
|
102
|
+
if not memories:
|
|
103
|
+
logger.debug("No relevant memories found")
|
|
104
|
+
return HookResult(success=True, data=context.data, modified=False)
|
|
105
|
+
|
|
106
|
+
# Enrich context with memories
|
|
107
|
+
enriched_data = self._enrich_delegation_context(
|
|
108
|
+
context.data, memories, context.data.get("agent", "Agent")
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
logger.info(
|
|
112
|
+
f"Enriched delegation context with {len(memories)} memories for {context.data.get('agent')}"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return HookResult(
|
|
116
|
+
success=True,
|
|
117
|
+
data=enriched_data,
|
|
118
|
+
modified=True,
|
|
119
|
+
metadata={
|
|
120
|
+
"memories_added": len(memories),
|
|
121
|
+
"memory_source": "kuzu",
|
|
122
|
+
"agent": context.data.get("agent"),
|
|
123
|
+
},
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
except Exception as e:
|
|
127
|
+
logger.error(f"Error in kuzu enrichment hook: {e}")
|
|
128
|
+
# Don't fail the delegation if memory enrichment fails
|
|
129
|
+
return HookResult(
|
|
130
|
+
success=True,
|
|
131
|
+
data=context.data,
|
|
132
|
+
modified=False,
|
|
133
|
+
error=f"Memory enrichment failed: {e}",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
def _extract_query_from_context(self, data: Dict[str, Any]) -> Optional[str]:
|
|
137
|
+
"""
|
|
138
|
+
Extract query text for memory retrieval.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
data: Delegation context data
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Query string or None
|
|
145
|
+
"""
|
|
146
|
+
# Try various context fields
|
|
147
|
+
delegation_context = data.get("context", {})
|
|
148
|
+
|
|
149
|
+
# Handle string context
|
|
150
|
+
if isinstance(delegation_context, str):
|
|
151
|
+
return delegation_context
|
|
152
|
+
|
|
153
|
+
# Handle dict context
|
|
154
|
+
if isinstance(delegation_context, dict):
|
|
155
|
+
# Try common fields
|
|
156
|
+
for field in ["prompt", "task", "query", "user_request", "description"]:
|
|
157
|
+
if field in delegation_context:
|
|
158
|
+
value = delegation_context[field]
|
|
159
|
+
if isinstance(value, str):
|
|
160
|
+
return value
|
|
161
|
+
|
|
162
|
+
# If no specific field, join all string values
|
|
163
|
+
text_parts = [
|
|
164
|
+
str(v) for v in delegation_context.values() if isinstance(v, str)
|
|
165
|
+
]
|
|
166
|
+
if text_parts:
|
|
167
|
+
return " ".join(text_parts)
|
|
168
|
+
|
|
169
|
+
# Fallback: try to get task or instruction directly
|
|
170
|
+
if "task" in data and isinstance(data["task"], str):
|
|
171
|
+
return data["task"]
|
|
172
|
+
|
|
173
|
+
if "instruction" in data and isinstance(data["instruction"], str):
|
|
174
|
+
return data["instruction"]
|
|
175
|
+
|
|
176
|
+
return None
|
|
177
|
+
|
|
178
|
+
def _enrich_delegation_context(
|
|
179
|
+
self, original_data: Dict[str, Any], memories: list, agent_name: str
|
|
180
|
+
) -> Dict[str, Any]:
|
|
181
|
+
"""
|
|
182
|
+
Enrich delegation context with memories.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
original_data: Original delegation data
|
|
186
|
+
memories: Retrieved memories
|
|
187
|
+
agent_name: Name of the agent
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
Enriched delegation data
|
|
191
|
+
"""
|
|
192
|
+
# Format memories
|
|
193
|
+
memory_section = self._format_memory_section(memories, agent_name)
|
|
194
|
+
|
|
195
|
+
# Create enriched data
|
|
196
|
+
enriched_data = original_data.copy()
|
|
197
|
+
|
|
198
|
+
# Get existing context
|
|
199
|
+
delegation_context = enriched_data.get("context", {})
|
|
200
|
+
if isinstance(delegation_context, str):
|
|
201
|
+
delegation_context = {"prompt": delegation_context}
|
|
202
|
+
|
|
203
|
+
# Add memory section
|
|
204
|
+
if isinstance(delegation_context, dict):
|
|
205
|
+
# Prepend memory section to context
|
|
206
|
+
delegation_context["kuzu_memories"] = memory_section
|
|
207
|
+
|
|
208
|
+
# If there's a main prompt/task, prepend memory note
|
|
209
|
+
for field in ["prompt", "task", "instruction"]:
|
|
210
|
+
if field in delegation_context and isinstance(
|
|
211
|
+
delegation_context[field], str
|
|
212
|
+
):
|
|
213
|
+
delegation_context[field] = (
|
|
214
|
+
f"{memory_section}\n\n{delegation_context[field]}"
|
|
215
|
+
)
|
|
216
|
+
break
|
|
217
|
+
else:
|
|
218
|
+
# If context is not dict, create new dict with memory
|
|
219
|
+
delegation_context = {
|
|
220
|
+
"kuzu_memories": memory_section,
|
|
221
|
+
"original_context": delegation_context,
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
enriched_data["context"] = delegation_context
|
|
225
|
+
enriched_data["_kuzu_enriched"] = True
|
|
226
|
+
|
|
227
|
+
return enriched_data
|
|
228
|
+
|
|
229
|
+
def _format_memory_section(self, memories: list, agent_name: str) -> str:
|
|
230
|
+
"""
|
|
231
|
+
Format memories into a readable section.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
memories: List of memory dictionaries
|
|
235
|
+
agent_name: Name of the agent
|
|
236
|
+
|
|
237
|
+
Returns:
|
|
238
|
+
Formatted memory section
|
|
239
|
+
"""
|
|
240
|
+
memory_text = self.kuzu_hook._format_memories(memories)
|
|
241
|
+
|
|
242
|
+
return f"""
|
|
243
|
+
=== RELEVANT KNOWLEDGE FROM KUZU MEMORY ===
|
|
244
|
+
{agent_name}, you have access to these relevant memories from the knowledge graph:
|
|
245
|
+
|
|
246
|
+
{memory_text}
|
|
247
|
+
|
|
248
|
+
INSTRUCTIONS: Review these memories before proceeding. Apply learned patterns and avoid known mistakes.
|
|
249
|
+
Use this knowledge to provide more informed and contextual responses.
|
|
250
|
+
===========================================
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
# Create a singleton instance
|
|
255
|
+
_kuzu_enrichment_hook = None
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def get_kuzu_enrichment_hook() -> KuzuEnrichmentHook:
|
|
259
|
+
"""Get the singleton kuzu-memory enrichment hook instance."""
|
|
260
|
+
global _kuzu_enrichment_hook
|
|
261
|
+
if _kuzu_enrichment_hook is None:
|
|
262
|
+
_kuzu_enrichment_hook = KuzuEnrichmentHook()
|
|
263
|
+
return _kuzu_enrichment_hook
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Kuzu-Memory Integration Hook
|
|
3
|
+
============================
|
|
4
|
+
|
|
5
|
+
Integrates kuzu-memory knowledge graph with Claude MPM for persistent memory
|
|
6
|
+
across conversations. This hook intercepts user prompts to enrich them with
|
|
7
|
+
relevant memories and stores new learnings after responses.
|
|
8
|
+
|
|
9
|
+
WHY: Claude MPM needs a way to persistently remember information across
|
|
10
|
+
different conversations and sessions. Kuzu-memory provides a graph database
|
|
11
|
+
for structured memory storage with semantic search capabilities.
|
|
12
|
+
|
|
13
|
+
DESIGN DECISIONS:
|
|
14
|
+
- Priority 10 for early execution to enrich prompts before other hooks
|
|
15
|
+
- Uses subprocess to call kuzu-memory directly for maximum compatibility
|
|
16
|
+
- Graceful degradation if kuzu-memory is not in PATH (though it's now required)
|
|
17
|
+
- Automatic extraction and storage of important information
|
|
18
|
+
- kuzu-memory>=1.1.5 is now a REQUIRED dependency (moved from optional in v4.8.6)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import json
|
|
22
|
+
import re
|
|
23
|
+
import shutil
|
|
24
|
+
import subprocess
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Any, Dict, List, Optional
|
|
27
|
+
|
|
28
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
29
|
+
from claude_mpm.hooks.base_hook import HookContext, HookResult, SubmitHook
|
|
30
|
+
|
|
31
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class KuzuMemoryHook(SubmitHook):
|
|
35
|
+
"""
|
|
36
|
+
Hook that integrates kuzu-memory for persistent knowledge management.
|
|
37
|
+
|
|
38
|
+
This hook:
|
|
39
|
+
1. Checks if kuzu-memory is installed via pipx
|
|
40
|
+
2. Enriches user prompts with relevant memories
|
|
41
|
+
3. Stores important information from conversations
|
|
42
|
+
4. Provides context-aware memory retrieval
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self):
|
|
46
|
+
"""Initialize the kuzu-memory integration hook."""
|
|
47
|
+
super().__init__(name="kuzu_memory_integration", priority=10)
|
|
48
|
+
|
|
49
|
+
# Check if kuzu-memory is available
|
|
50
|
+
self.kuzu_memory_cmd = self._detect_kuzu_memory()
|
|
51
|
+
self.enabled = self.kuzu_memory_cmd is not None
|
|
52
|
+
|
|
53
|
+
if not self.enabled:
|
|
54
|
+
logger.warning(
|
|
55
|
+
"Kuzu-memory not found in PATH. As of v4.8.6, it's a required dependency. "
|
|
56
|
+
"Install with: pip install kuzu-memory>=1.1.5 or pipx install kuzu-memory"
|
|
57
|
+
)
|
|
58
|
+
else:
|
|
59
|
+
logger.info(f"Kuzu-memory integration enabled: {self.kuzu_memory_cmd}")
|
|
60
|
+
|
|
61
|
+
# Use current project directory (kuzu-memory works with project-specific databases)
|
|
62
|
+
self.project_path = Path.cwd()
|
|
63
|
+
|
|
64
|
+
# Memory extraction patterns
|
|
65
|
+
self.memory_patterns = [
|
|
66
|
+
r"#\s*(?:Remember|Memorize|Store):\s*(.+?)(?:#|$)",
|
|
67
|
+
r"(?:Important|Note|Key point):\s*(.+?)(?:\n|$)",
|
|
68
|
+
r"(?:Learned|Discovered|Found that):\s*(.+?)(?:\n|$)",
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
def _detect_kuzu_memory(self) -> Optional[str]:
|
|
72
|
+
"""
|
|
73
|
+
Detect if kuzu-memory is installed and return its command path.
|
|
74
|
+
|
|
75
|
+
Priority:
|
|
76
|
+
1. Check pipx installation
|
|
77
|
+
2. Check system PATH
|
|
78
|
+
3. Return None if not found
|
|
79
|
+
|
|
80
|
+
NOTE: As of v4.8.6, kuzu-memory is a required dependency and should be
|
|
81
|
+
installed via pip. This method checks both pipx and system PATH for
|
|
82
|
+
backward compatibility.
|
|
83
|
+
"""
|
|
84
|
+
# Check pipx installation
|
|
85
|
+
pipx_path = (
|
|
86
|
+
Path.home()
|
|
87
|
+
/ ".local"
|
|
88
|
+
/ "pipx"
|
|
89
|
+
/ "venvs"
|
|
90
|
+
/ "kuzu-memory"
|
|
91
|
+
/ "bin"
|
|
92
|
+
/ "kuzu-memory"
|
|
93
|
+
)
|
|
94
|
+
if pipx_path.exists():
|
|
95
|
+
return str(pipx_path)
|
|
96
|
+
|
|
97
|
+
# Check system PATH
|
|
98
|
+
kuzu_cmd = shutil.which("kuzu-memory")
|
|
99
|
+
if kuzu_cmd:
|
|
100
|
+
return kuzu_cmd
|
|
101
|
+
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
def execute(self, context: HookContext) -> HookResult:
|
|
105
|
+
"""
|
|
106
|
+
Process user prompts with kuzu-memory integration.
|
|
107
|
+
|
|
108
|
+
This method:
|
|
109
|
+
1. Retrieves relevant memories for the prompt
|
|
110
|
+
2. Enriches the prompt with memory context
|
|
111
|
+
3. Stores new memories after processing
|
|
112
|
+
"""
|
|
113
|
+
if not self.enabled:
|
|
114
|
+
return HookResult(success=True, data=context.data, modified=False)
|
|
115
|
+
|
|
116
|
+
try:
|
|
117
|
+
# Extract user prompt
|
|
118
|
+
prompt = context.data.get("prompt", "")
|
|
119
|
+
if not prompt:
|
|
120
|
+
return HookResult(success=True, data=context.data, modified=False)
|
|
121
|
+
|
|
122
|
+
# Retrieve relevant memories
|
|
123
|
+
memories = self._retrieve_memories(prompt)
|
|
124
|
+
|
|
125
|
+
if memories:
|
|
126
|
+
# Enrich prompt with memories
|
|
127
|
+
enriched_data = self._enrich_prompt(context.data, prompt, memories)
|
|
128
|
+
|
|
129
|
+
logger.info(f"Enriched prompt with {len(memories)} memories")
|
|
130
|
+
|
|
131
|
+
# Store the original prompt for later processing
|
|
132
|
+
enriched_data["_original_prompt"] = prompt
|
|
133
|
+
enriched_data["_memory_enriched"] = True
|
|
134
|
+
|
|
135
|
+
return HookResult(
|
|
136
|
+
success=True,
|
|
137
|
+
data=enriched_data,
|
|
138
|
+
modified=True,
|
|
139
|
+
metadata={
|
|
140
|
+
"memories_added": len(memories),
|
|
141
|
+
"memory_source": "kuzu",
|
|
142
|
+
},
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return HookResult(success=True, data=context.data, modified=False)
|
|
146
|
+
|
|
147
|
+
except Exception as e:
|
|
148
|
+
logger.error(f"Kuzu-memory hook failed: {e}")
|
|
149
|
+
# Don't fail the request if memory integration fails
|
|
150
|
+
return HookResult(
|
|
151
|
+
success=True,
|
|
152
|
+
data=context.data,
|
|
153
|
+
modified=False,
|
|
154
|
+
error=f"Memory integration failed: {e}",
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def _retrieve_memories(self, query: str) -> List[Dict[str, Any]]:
|
|
158
|
+
"""
|
|
159
|
+
Retrieve relevant memories for the given query.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
query: The user prompt to find memories for
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
List of relevant memory dictionaries
|
|
166
|
+
"""
|
|
167
|
+
try:
|
|
168
|
+
# Type narrowing: ensure kuzu_memory_cmd is not None before using
|
|
169
|
+
if self.kuzu_memory_cmd is None:
|
|
170
|
+
return []
|
|
171
|
+
|
|
172
|
+
# Use kuzu-memory recall command (v1.2.7+ syntax)
|
|
173
|
+
result = subprocess.run(
|
|
174
|
+
[self.kuzu_memory_cmd, "memory", "recall", query, "--format", "json"],
|
|
175
|
+
capture_output=True,
|
|
176
|
+
text=True,
|
|
177
|
+
timeout=5,
|
|
178
|
+
cwd=str(self.project_path),
|
|
179
|
+
check=False,
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
if result.returncode == 0 and result.stdout:
|
|
183
|
+
try:
|
|
184
|
+
# Parse JSON with strict=False to handle control characters
|
|
185
|
+
data = json.loads(result.stdout, strict=False)
|
|
186
|
+
# v1.2.7 returns dict with 'memories' key, not array
|
|
187
|
+
if isinstance(data, dict):
|
|
188
|
+
memories = data.get("memories", [])
|
|
189
|
+
else:
|
|
190
|
+
memories = data if isinstance(data, list) else []
|
|
191
|
+
return memories
|
|
192
|
+
except json.JSONDecodeError as e:
|
|
193
|
+
logger.warning(f"Failed to parse kuzu-memory JSON output: {e}")
|
|
194
|
+
logger.debug(f"Raw output: {result.stdout[:200]}")
|
|
195
|
+
return [] # Graceful fallback
|
|
196
|
+
|
|
197
|
+
except (subprocess.TimeoutExpired, Exception) as e:
|
|
198
|
+
logger.debug(f"Memory retrieval failed: {e}")
|
|
199
|
+
|
|
200
|
+
return []
|
|
201
|
+
|
|
202
|
+
def _enrich_prompt(
|
|
203
|
+
self, original_data: Dict[str, Any], prompt: str, memories: List[Dict[str, Any]]
|
|
204
|
+
) -> Dict[str, Any]:
|
|
205
|
+
"""
|
|
206
|
+
Enrich the user prompt with relevant memories.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
original_data: Original hook context data
|
|
210
|
+
prompt: User prompt
|
|
211
|
+
memories: Retrieved memories
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Enriched context data
|
|
215
|
+
"""
|
|
216
|
+
# Format memories for context
|
|
217
|
+
memory_context = self._format_memories(memories)
|
|
218
|
+
|
|
219
|
+
# Create enriched prompt
|
|
220
|
+
enriched_prompt = f"""
|
|
221
|
+
## RELEVANT MEMORIES FROM KUZU KNOWLEDGE GRAPH
|
|
222
|
+
|
|
223
|
+
{memory_context}
|
|
224
|
+
|
|
225
|
+
## USER REQUEST
|
|
226
|
+
|
|
227
|
+
{prompt}
|
|
228
|
+
|
|
229
|
+
Note: Use the memories above to provide more informed and contextual responses.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
# Create new data with enriched prompt
|
|
233
|
+
enriched_data = original_data.copy()
|
|
234
|
+
enriched_data["prompt"] = enriched_prompt
|
|
235
|
+
|
|
236
|
+
return enriched_data
|
|
237
|
+
|
|
238
|
+
def _format_memories(self, memories: List[Dict[str, Any]]) -> str:
|
|
239
|
+
"""
|
|
240
|
+
Format memories into a readable context string.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
memories: List of memory dictionaries
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Formatted memory context
|
|
247
|
+
"""
|
|
248
|
+
if not memories:
|
|
249
|
+
return "No relevant memories found."
|
|
250
|
+
|
|
251
|
+
formatted = []
|
|
252
|
+
for i, memory in enumerate(memories, 1):
|
|
253
|
+
# Extract memory content and metadata
|
|
254
|
+
content = memory.get("content", "")
|
|
255
|
+
tags = memory.get("tags", [])
|
|
256
|
+
memory.get("timestamp", "")
|
|
257
|
+
relevance = memory.get("relevance", 0.0)
|
|
258
|
+
|
|
259
|
+
# Format memory entry
|
|
260
|
+
entry = f"{i}. {content}"
|
|
261
|
+
if tags:
|
|
262
|
+
entry += f" [Tags: {', '.join(tags)}]"
|
|
263
|
+
if relevance > 0:
|
|
264
|
+
entry += f" (Relevance: {relevance:.2f})"
|
|
265
|
+
|
|
266
|
+
formatted.append(entry)
|
|
267
|
+
|
|
268
|
+
return "\n".join(formatted)
|
|
269
|
+
|
|
270
|
+
def store_memory(self, content: str, tags: Optional[List[str]] = None) -> bool:
|
|
271
|
+
"""
|
|
272
|
+
Store a memory using kuzu-memory.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
content: The memory content to store
|
|
276
|
+
tags: Optional tags for categorization
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
True if storage was successful
|
|
280
|
+
"""
|
|
281
|
+
if not self.enabled or self.kuzu_memory_cmd is None:
|
|
282
|
+
return False
|
|
283
|
+
|
|
284
|
+
try:
|
|
285
|
+
# Use kuzu-memory store command (v1.2.7+ syntax)
|
|
286
|
+
cmd = [self.kuzu_memory_cmd, "memory", "store", content]
|
|
287
|
+
|
|
288
|
+
# Execute store command in project directory
|
|
289
|
+
result = subprocess.run(
|
|
290
|
+
cmd,
|
|
291
|
+
capture_output=True,
|
|
292
|
+
text=True,
|
|
293
|
+
timeout=5,
|
|
294
|
+
cwd=str(self.project_path),
|
|
295
|
+
check=False,
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
if result.returncode == 0:
|
|
299
|
+
logger.debug(f"Stored memory in kuzu: {content[:50]}...")
|
|
300
|
+
return True
|
|
301
|
+
logger.warning(f"Failed to store memory in kuzu: {result.stderr}")
|
|
302
|
+
return False
|
|
303
|
+
|
|
304
|
+
except Exception as e:
|
|
305
|
+
logger.error(f"Failed to store memory: {e}")
|
|
306
|
+
|
|
307
|
+
return False
|
|
308
|
+
|
|
309
|
+
def extract_and_store_learnings(self, text: str) -> int:
|
|
310
|
+
"""
|
|
311
|
+
Extract learnings from text and store them as memories.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
text: Text to extract learnings from
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
Number of learnings stored
|
|
318
|
+
"""
|
|
319
|
+
if not self.enabled:
|
|
320
|
+
return 0
|
|
321
|
+
|
|
322
|
+
stored_count = 0
|
|
323
|
+
|
|
324
|
+
# Extract learnings using patterns
|
|
325
|
+
for pattern in self.memory_patterns:
|
|
326
|
+
matches = re.finditer(pattern, text, re.IGNORECASE | re.MULTILINE)
|
|
327
|
+
for match in matches:
|
|
328
|
+
learning = match.group(1).strip()
|
|
329
|
+
if learning and len(learning) > 10: # Minimum length check
|
|
330
|
+
# Determine tags based on content
|
|
331
|
+
tags = self._infer_tags(learning)
|
|
332
|
+
|
|
333
|
+
# Store the learning
|
|
334
|
+
if self.store_memory(learning, tags):
|
|
335
|
+
stored_count += 1
|
|
336
|
+
|
|
337
|
+
return stored_count
|
|
338
|
+
|
|
339
|
+
def _infer_tags(self, content: str) -> List[str]:
|
|
340
|
+
"""
|
|
341
|
+
Infer tags based on memory content.
|
|
342
|
+
|
|
343
|
+
Args:
|
|
344
|
+
content: Memory content
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
List of inferred tags
|
|
348
|
+
"""
|
|
349
|
+
tags = []
|
|
350
|
+
content_lower = content.lower()
|
|
351
|
+
|
|
352
|
+
# Technical tags
|
|
353
|
+
if any(
|
|
354
|
+
word in content_lower for word in ["code", "function", "class", "module"]
|
|
355
|
+
):
|
|
356
|
+
tags.append("technical")
|
|
357
|
+
if any(word in content_lower for word in ["bug", "error", "fix", "issue"]):
|
|
358
|
+
tags.append("debugging")
|
|
359
|
+
if any(word in content_lower for word in ["pattern", "architecture", "design"]):
|
|
360
|
+
tags.append("architecture")
|
|
361
|
+
if any(word in content_lower for word in ["performance", "optimize", "speed"]):
|
|
362
|
+
tags.append("performance")
|
|
363
|
+
|
|
364
|
+
# Project context tags
|
|
365
|
+
if "claude-mpm" in content_lower or "mpm" in content_lower:
|
|
366
|
+
tags.append("claude-mpm")
|
|
367
|
+
if any(word in content_lower for word in ["hook", "agent", "service"]):
|
|
368
|
+
tags.append("framework")
|
|
369
|
+
|
|
370
|
+
# Default tag if no others found
|
|
371
|
+
if not tags:
|
|
372
|
+
tags.append("general")
|
|
373
|
+
|
|
374
|
+
return tags
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
# Create a singleton instance
|
|
378
|
+
_kuzu_memory_hook = None
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
def get_kuzu_memory_hook() -> KuzuMemoryHook:
|
|
382
|
+
"""Get the singleton kuzu-memory hook instance."""
|
|
383
|
+
global _kuzu_memory_hook
|
|
384
|
+
if _kuzu_memory_hook is None:
|
|
385
|
+
_kuzu_memory_hook = KuzuMemoryHook()
|
|
386
|
+
return _kuzu_memory_hook
|