claude-mpm 4.1.26__py3-none-any.whl → 4.24.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +420 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +299 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +7 -4
- claude_mpm/agents/templates/{agentic_coder_optimizer.json → agentic-coder-optimizer.json} +33 -7
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +10 -4
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +43 -9
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +14 -4
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +25 -5
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +46 -21
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +167 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -378
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +15 -10
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +469 -1064
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +7 -7
- claude_mpm/cli/commands/doctor.py +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agents_parser.py +116 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +143 -3
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +118 -8
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +137 -14
- claude_mpm/commands/mpm-help.md +285 -5
- claude_mpm/commands/mpm-init.md +374 -15
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +71 -9
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +15 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +19 -8
- claude_mpm/core/config.py +85 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +38 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/dashboard.css +588 -6
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
- claude_mpm/dashboard/static/js/components/session-manager.js +7 -7
- claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +455 -23
- claude_mpm/dashboard/static/js/components/working-directory.js +44 -9
- claude_mpm/dashboard/static/js/dashboard.js +245 -132
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +49 -22
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +112 -109
- claude_mpm/experimental/cli_enhancements.py +4 -2
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +183 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +33 -7
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +715 -47
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +9 -7
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +79 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +8 -4
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1612 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +729 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +141 -4
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +23 -21
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +2 -2
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +470 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +8 -4
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/tools/__main__.py +1 -1
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +108 -27
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +2 -2
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -16,7 +16,6 @@ import fcntl
|
|
|
16
16
|
import gzip
|
|
17
17
|
import hashlib
|
|
18
18
|
import json
|
|
19
|
-
import logging
|
|
20
19
|
import os
|
|
21
20
|
import pickle
|
|
22
21
|
import platform
|
|
@@ -25,6 +24,10 @@ import time
|
|
|
25
24
|
from contextlib import contextmanager, suppress
|
|
26
25
|
from typing import Any, Dict, Optional, Tuple, Union
|
|
27
26
|
|
|
27
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
28
|
+
|
|
29
|
+
logger = get_logger(__name__)
|
|
30
|
+
|
|
28
31
|
|
|
29
32
|
class StateStorage:
|
|
30
33
|
"""Reliable state storage with atomic operations."""
|
|
@@ -38,9 +41,6 @@ class StateStorage:
|
|
|
38
41
|
self.storage_dir = storage_dir or Path.home() / ".claude-mpm" / "storage"
|
|
39
42
|
self.storage_dir.mkdir(parents=True, exist_ok=True)
|
|
40
43
|
|
|
41
|
-
# Logging
|
|
42
|
-
self.logger = logging.getLogger(__name__)
|
|
43
|
-
|
|
44
44
|
# File locking support (Unix-like systems)
|
|
45
45
|
self.supports_locking = platform.system() != "Windows"
|
|
46
46
|
|
|
@@ -79,14 +79,14 @@ class StateStorage:
|
|
|
79
79
|
with gzip.open(file_path, "wt", encoding="utf-8") as f:
|
|
80
80
|
json.dump(data, f, indent=2, default=str)
|
|
81
81
|
else:
|
|
82
|
-
with open(
|
|
82
|
+
with file_path.open("w") as f:
|
|
83
83
|
json.dump(data, f, indent=2, default=str)
|
|
84
84
|
|
|
85
85
|
self.write_count += 1
|
|
86
86
|
return True
|
|
87
87
|
|
|
88
88
|
except Exception as e:
|
|
89
|
-
|
|
89
|
+
logger.error(f"Failed to write JSON to {file_path}: {e}")
|
|
90
90
|
self.error_count += 1
|
|
91
91
|
return False
|
|
92
92
|
|
|
@@ -106,7 +106,7 @@ class StateStorage:
|
|
|
106
106
|
file_path = Path(file_path)
|
|
107
107
|
|
|
108
108
|
if not file_path.exists():
|
|
109
|
-
|
|
109
|
+
logger.debug(f"File not found: {file_path}")
|
|
110
110
|
return None
|
|
111
111
|
|
|
112
112
|
# Auto-detect compression
|
|
@@ -118,14 +118,14 @@ class StateStorage:
|
|
|
118
118
|
with gzip.open(file_path, "rt", encoding="utf-8") as f:
|
|
119
119
|
data = json.load(f)
|
|
120
120
|
else:
|
|
121
|
-
with open(
|
|
121
|
+
with file_path.open() as f:
|
|
122
122
|
data = json.load(f)
|
|
123
123
|
|
|
124
124
|
self.read_count += 1
|
|
125
125
|
return data
|
|
126
126
|
|
|
127
127
|
except Exception as e:
|
|
128
|
-
|
|
128
|
+
logger.error(f"Failed to read JSON from {file_path}: {e}")
|
|
129
129
|
self.error_count += 1
|
|
130
130
|
return None
|
|
131
131
|
|
|
@@ -159,14 +159,14 @@ class StateStorage:
|
|
|
159
159
|
with gzip.open(file_path, "wb") as f:
|
|
160
160
|
pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)
|
|
161
161
|
else:
|
|
162
|
-
with open(
|
|
162
|
+
with file_path.open("wb") as f:
|
|
163
163
|
pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)
|
|
164
164
|
|
|
165
165
|
self.write_count += 1
|
|
166
166
|
return True
|
|
167
167
|
|
|
168
168
|
except Exception as e:
|
|
169
|
-
|
|
169
|
+
logger.error(f"Failed to write pickle to {file_path}: {e}")
|
|
170
170
|
self.error_count += 1
|
|
171
171
|
return False
|
|
172
172
|
|
|
@@ -186,7 +186,7 @@ class StateStorage:
|
|
|
186
186
|
file_path = Path(file_path)
|
|
187
187
|
|
|
188
188
|
if not file_path.exists():
|
|
189
|
-
|
|
189
|
+
logger.debug(f"File not found: {file_path}")
|
|
190
190
|
return None
|
|
191
191
|
|
|
192
192
|
# Auto-detect compression
|
|
@@ -198,14 +198,14 @@ class StateStorage:
|
|
|
198
198
|
with gzip.open(file_path, "rb") as f:
|
|
199
199
|
data = pickle.load(f)
|
|
200
200
|
else:
|
|
201
|
-
with open(
|
|
201
|
+
with file_path.open("rb") as f:
|
|
202
202
|
data = pickle.load(f)
|
|
203
203
|
|
|
204
204
|
self.read_count += 1
|
|
205
205
|
return data
|
|
206
206
|
|
|
207
207
|
except Exception as e:
|
|
208
|
-
|
|
208
|
+
logger.error(f"Failed to read pickle from {file_path}: {e}")
|
|
209
209
|
self.error_count += 1
|
|
210
210
|
return None
|
|
211
211
|
|
|
@@ -262,16 +262,16 @@ class StateStorage:
|
|
|
262
262
|
Path(temp_path).replace(file_path)
|
|
263
263
|
|
|
264
264
|
self.write_count += 1
|
|
265
|
-
|
|
265
|
+
logger.debug(f"Atomic write successful: {file_path}")
|
|
266
266
|
return True
|
|
267
267
|
|
|
268
268
|
finally:
|
|
269
269
|
# Clean up temp file if it still exists
|
|
270
270
|
if Path(temp_path).exists():
|
|
271
|
-
|
|
271
|
+
Path(temp_path).unlink()
|
|
272
272
|
|
|
273
273
|
except Exception as e:
|
|
274
|
-
|
|
274
|
+
logger.error(f"Atomic write failed for {file_path}: {e}")
|
|
275
275
|
self.error_count += 1
|
|
276
276
|
return False
|
|
277
277
|
|
|
@@ -288,14 +288,14 @@ class StateStorage:
|
|
|
288
288
|
"""
|
|
289
289
|
if not self.supports_locking:
|
|
290
290
|
# No locking on Windows
|
|
291
|
-
with open(
|
|
291
|
+
with Path(file_path).open(mode) as f:
|
|
292
292
|
yield f
|
|
293
293
|
return
|
|
294
294
|
|
|
295
295
|
# Unix-like systems with fcntl
|
|
296
296
|
f = None
|
|
297
297
|
try:
|
|
298
|
-
f = open(
|
|
298
|
+
f = Path(file_path).open(mode)
|
|
299
299
|
|
|
300
300
|
# Try to acquire lock (non-blocking)
|
|
301
301
|
max_attempts = 50
|
|
@@ -327,7 +327,7 @@ class StateStorage:
|
|
|
327
327
|
|
|
328
328
|
# Calculate checksum
|
|
329
329
|
hasher = hashlib.sha256()
|
|
330
|
-
with open(
|
|
330
|
+
with file_path.open("rb") as f:
|
|
331
331
|
for chunk in iter(lambda: f.read(4096), b""):
|
|
332
332
|
hasher.update(chunk)
|
|
333
333
|
|
|
@@ -335,11 +335,11 @@ class StateStorage:
|
|
|
335
335
|
|
|
336
336
|
# Write checksum file
|
|
337
337
|
checksum_path = file_path.with_suffix(file_path.suffix + ".sha256")
|
|
338
|
-
with open(
|
|
338
|
+
with checksum_path.open("w") as f:
|
|
339
339
|
f.write(checksum)
|
|
340
340
|
|
|
341
341
|
except Exception as e:
|
|
342
|
-
|
|
342
|
+
logger.warning(f"Could not add checksum: {e}")
|
|
343
343
|
|
|
344
344
|
def verify_checksum(self, file_path: Union[str, Path]) -> bool:
|
|
345
345
|
"""Verify file checksum for integrity.
|
|
@@ -358,25 +358,25 @@ class StateStorage:
|
|
|
358
358
|
return True # No checksum to verify
|
|
359
359
|
|
|
360
360
|
# Read expected checksum
|
|
361
|
-
with open(
|
|
361
|
+
with checksum_path.open() as f:
|
|
362
362
|
expected = f.read().strip()
|
|
363
363
|
|
|
364
364
|
# Calculate actual checksum
|
|
365
365
|
hasher = hashlib.sha256()
|
|
366
|
-
with open(
|
|
366
|
+
with file_path.open("rb") as f:
|
|
367
367
|
for chunk in iter(lambda: f.read(4096), b""):
|
|
368
368
|
hasher.update(chunk)
|
|
369
369
|
|
|
370
370
|
actual = hasher.hexdigest()
|
|
371
371
|
|
|
372
372
|
if actual != expected:
|
|
373
|
-
|
|
373
|
+
logger.error(f"Checksum mismatch for {file_path}")
|
|
374
374
|
return False
|
|
375
375
|
|
|
376
376
|
return True
|
|
377
377
|
|
|
378
378
|
except Exception as e:
|
|
379
|
-
|
|
379
|
+
logger.warning(f"Could not verify checksum: {e}")
|
|
380
380
|
return True # Assume valid if can't verify
|
|
381
381
|
|
|
382
382
|
def cleanup_temp_files(self) -> int:
|
|
@@ -396,8 +396,8 @@ class StateStorage:
|
|
|
396
396
|
if age > 3600:
|
|
397
397
|
temp_file.unlink()
|
|
398
398
|
cleaned += 1
|
|
399
|
-
|
|
400
|
-
except:
|
|
399
|
+
logger.debug(f"Cleaned up temp file: {temp_file}")
|
|
400
|
+
except Exception:
|
|
401
401
|
pass
|
|
402
402
|
|
|
403
403
|
# Clean up orphaned checksum files
|
|
@@ -408,12 +408,12 @@ class StateStorage:
|
|
|
408
408
|
cleaned += 1
|
|
409
409
|
|
|
410
410
|
if cleaned > 0:
|
|
411
|
-
|
|
411
|
+
logger.info(f"Cleaned up {cleaned} temporary files")
|
|
412
412
|
|
|
413
413
|
return cleaned
|
|
414
414
|
|
|
415
415
|
except Exception as e:
|
|
416
|
-
|
|
416
|
+
logger.error(f"Error cleaning up temp files: {e}")
|
|
417
417
|
return 0
|
|
418
418
|
|
|
419
419
|
def get_storage_info(self) -> Dict[str, Any]:
|
|
@@ -447,7 +447,7 @@ class StateStorage:
|
|
|
447
447
|
}
|
|
448
448
|
|
|
449
449
|
except Exception as e:
|
|
450
|
-
|
|
450
|
+
logger.error(f"Error getting storage info: {e}")
|
|
451
451
|
return {"storage_directory": str(self.storage_dir), "error": str(e)}
|
|
452
452
|
|
|
453
453
|
|
claude_mpm/tools/__main__.py
CHANGED
|
@@ -118,7 +118,7 @@ def main():
|
|
|
118
118
|
output_file = None
|
|
119
119
|
if args.output_file:
|
|
120
120
|
try:
|
|
121
|
-
output_file =
|
|
121
|
+
output_file = Path(args.output_file).open("w")
|
|
122
122
|
except Exception as e:
|
|
123
123
|
emit_json_event(
|
|
124
124
|
"code:analysis:error", {"message": f"Failed to open output file: {e}"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Code Tree Analyzer
|
|
4
|
+
==================
|
|
5
|
+
|
|
6
|
+
Analyzes source code using AST to extract structure and metrics,
|
|
7
|
+
supporting multiple languages and emitting incremental events for visualization.
|
|
8
|
+
|
|
9
|
+
This module has been refactored from a single 1,825-line file into focused,
|
|
10
|
+
maintainable components while preserving complete backward compatibility.
|
|
11
|
+
|
|
12
|
+
Public API:
|
|
13
|
+
-----------
|
|
14
|
+
- CodeTreeAnalyzer: Main analyzer class
|
|
15
|
+
- CodeNode: Data structure for code nodes
|
|
16
|
+
- GitignoreManager: Gitignore pattern matching
|
|
17
|
+
- PythonAnalyzer: Python AST analysis
|
|
18
|
+
- MultiLanguageAnalyzer: Multi-language support
|
|
19
|
+
|
|
20
|
+
Example Usage:
|
|
21
|
+
--------------
|
|
22
|
+
from claude_mpm.tools.code_tree_analyzer import CodeTreeAnalyzer
|
|
23
|
+
|
|
24
|
+
analyzer = CodeTreeAnalyzer(emit_events=True)
|
|
25
|
+
result = analyzer.analyze_directory(Path("/path/to/code"))
|
|
26
|
+
print(result['stats'])
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# Public API - Backward compatible imports
|
|
30
|
+
from .core import CodeTreeAnalyzer
|
|
31
|
+
from .gitignore import GitignoreManager
|
|
32
|
+
from .models import CodeNode
|
|
33
|
+
from .multilang_analyzer import MultiLanguageAnalyzer
|
|
34
|
+
from .python_analyzer import PythonAnalyzer
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"CodeNode",
|
|
38
|
+
"CodeTreeAnalyzer",
|
|
39
|
+
"GitignoreManager",
|
|
40
|
+
"MultiLanguageAnalyzer",
|
|
41
|
+
"PythonAnalyzer",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
# Version info
|
|
45
|
+
__version__ = "2.0.0" # Major refactoring while maintaining API compatibility
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Analysis Module
|
|
4
|
+
===============
|
|
5
|
+
|
|
6
|
+
Coordinates file analysis across different language analyzers.
|
|
7
|
+
|
|
8
|
+
WHY: Centralizes file analysis logic and result processing,
|
|
9
|
+
separating it from directory traversal and caching concerns.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import time
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Dict, List, Tuple
|
|
15
|
+
|
|
16
|
+
from ...core.logging_config import get_logger
|
|
17
|
+
from .cache import CacheManager
|
|
18
|
+
from .events import EventManager
|
|
19
|
+
from .models import CodeNode
|
|
20
|
+
from .multilang_analyzer import MultiLanguageAnalyzer
|
|
21
|
+
from .python_analyzer import PythonAnalyzer
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class FileAnalyzer:
|
|
25
|
+
"""Coordinates file analysis using appropriate language analyzers."""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
python_analyzer: PythonAnalyzer,
|
|
30
|
+
multilang_analyzer: MultiLanguageAnalyzer,
|
|
31
|
+
cache_manager: CacheManager,
|
|
32
|
+
event_manager: EventManager,
|
|
33
|
+
):
|
|
34
|
+
"""Initialize file analyzer.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
python_analyzer: Python analyzer instance
|
|
38
|
+
multilang_analyzer: Multi-language analyzer instance
|
|
39
|
+
cache_manager: Cache manager instance
|
|
40
|
+
event_manager: Event manager instance
|
|
41
|
+
"""
|
|
42
|
+
self.logger = get_logger(__name__)
|
|
43
|
+
self.python_analyzer = python_analyzer
|
|
44
|
+
self.multilang_analyzer = multilang_analyzer
|
|
45
|
+
self.cache_manager = cache_manager
|
|
46
|
+
self.event_manager = event_manager
|
|
47
|
+
|
|
48
|
+
def analyze_file(self, file_path: str) -> Dict[str, any]:
|
|
49
|
+
"""Analyze a specific file and return its AST structure.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
file_path: Path to file to analyze
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Dictionary with file analysis results
|
|
56
|
+
"""
|
|
57
|
+
path = Path(file_path)
|
|
58
|
+
if not path.exists() or not path.is_file():
|
|
59
|
+
return {"error": f"Invalid file: {file_path}"}
|
|
60
|
+
|
|
61
|
+
language = self._get_language(path)
|
|
62
|
+
self.event_manager.emit_analysis_start(path, language)
|
|
63
|
+
|
|
64
|
+
# Check cache
|
|
65
|
+
cache_key = self.cache_manager.get_cache_key(path)
|
|
66
|
+
|
|
67
|
+
if cached_nodes := self.cache_manager.get(cache_key):
|
|
68
|
+
self.event_manager.emit_cache_hit(path)
|
|
69
|
+
filtered_nodes = self._filter_nodes(cached_nodes)
|
|
70
|
+
else:
|
|
71
|
+
_nodes, filtered_nodes, duration = self._analyze_and_cache_file(
|
|
72
|
+
path, language, cache_key
|
|
73
|
+
)
|
|
74
|
+
self.event_manager.emit_analysis_complete(path, filtered_nodes, duration)
|
|
75
|
+
|
|
76
|
+
# Prepare final data structures
|
|
77
|
+
final_nodes = filtered_nodes if filtered_nodes else []
|
|
78
|
+
elements = self._convert_nodes_to_elements(final_nodes)
|
|
79
|
+
|
|
80
|
+
return self._build_result(file_path, language, final_nodes, elements)
|
|
81
|
+
|
|
82
|
+
def _analyze_and_cache_file(
|
|
83
|
+
self, path: Path, language: str, cache_key: str
|
|
84
|
+
) -> Tuple[List[CodeNode], List[dict], float]:
|
|
85
|
+
"""Analyze file content and cache results.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
path: File path
|
|
89
|
+
language: Programming language
|
|
90
|
+
cache_key: Cache key for storing results
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Tuple of (all_nodes, filtered_nodes, duration)
|
|
94
|
+
"""
|
|
95
|
+
self.event_manager.emit_cache_miss(path)
|
|
96
|
+
self.event_manager.emit_parsing_start(path)
|
|
97
|
+
|
|
98
|
+
# Select analyzer based on language
|
|
99
|
+
analyzer = self._select_analyzer(language)
|
|
100
|
+
|
|
101
|
+
# Perform analysis
|
|
102
|
+
start_time = time.time()
|
|
103
|
+
nodes = analyzer.analyze_file(path) if analyzer else []
|
|
104
|
+
duration = time.time() - start_time
|
|
105
|
+
|
|
106
|
+
# Cache results
|
|
107
|
+
self.cache_manager.set(cache_key, nodes)
|
|
108
|
+
|
|
109
|
+
# Filter and process nodes
|
|
110
|
+
filtered_nodes = self._filter_and_emit_nodes(nodes, path)
|
|
111
|
+
|
|
112
|
+
return nodes, filtered_nodes, duration
|
|
113
|
+
|
|
114
|
+
def _select_analyzer(self, language: str):
|
|
115
|
+
"""Select appropriate analyzer for language.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
language: Programming language
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Analyzer instance or None
|
|
122
|
+
"""
|
|
123
|
+
if language == "python":
|
|
124
|
+
return self.python_analyzer
|
|
125
|
+
if language in {"javascript", "typescript"}:
|
|
126
|
+
return self.multilang_analyzer
|
|
127
|
+
return self.multilang_analyzer
|
|
128
|
+
|
|
129
|
+
def _filter_nodes(self, nodes: List[CodeNode]) -> List[dict]:
|
|
130
|
+
"""Filter nodes without emitting events.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
nodes: List of CodeNode objects
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
List of filtered node dictionaries
|
|
137
|
+
"""
|
|
138
|
+
return [self._node_to_dict(n) for n in nodes if not self._is_internal_node(n)]
|
|
139
|
+
|
|
140
|
+
def _filter_and_emit_nodes(self, nodes: List[CodeNode], path: Path) -> List[dict]:
|
|
141
|
+
"""Filter nodes and emit events for each.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
nodes: List of CodeNode objects
|
|
145
|
+
path: File path being analyzed
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
List of filtered node dictionaries
|
|
149
|
+
"""
|
|
150
|
+
filtered_nodes = []
|
|
151
|
+
for node in nodes:
|
|
152
|
+
if not self._is_internal_node(node):
|
|
153
|
+
self.event_manager.emit_node_found(node, path)
|
|
154
|
+
filtered_nodes.append(self._node_to_dict(node))
|
|
155
|
+
return filtered_nodes
|
|
156
|
+
|
|
157
|
+
def _node_to_dict(self, node: CodeNode) -> dict:
|
|
158
|
+
"""Convert CodeNode to dictionary.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
node: CodeNode object
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
Dictionary representation
|
|
165
|
+
"""
|
|
166
|
+
return {
|
|
167
|
+
"name": node.name,
|
|
168
|
+
"type": node.node_type,
|
|
169
|
+
"line_start": node.line_start,
|
|
170
|
+
"line_end": node.line_end,
|
|
171
|
+
"complexity": node.complexity,
|
|
172
|
+
"has_docstring": node.has_docstring,
|
|
173
|
+
"signature": node.signature,
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
def _convert_nodes_to_elements(self, final_nodes: List[dict]) -> List[dict]:
|
|
177
|
+
"""Convert nodes to elements format for dashboard.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
final_nodes: List of node dictionaries
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
List of element dictionaries
|
|
184
|
+
"""
|
|
185
|
+
elements = []
|
|
186
|
+
for node in final_nodes:
|
|
187
|
+
element = {
|
|
188
|
+
"name": node["name"],
|
|
189
|
+
"type": node["type"],
|
|
190
|
+
"line": node["line_start"],
|
|
191
|
+
"complexity": node["complexity"],
|
|
192
|
+
"signature": node.get("signature", ""),
|
|
193
|
+
"has_docstring": node.get("has_docstring", False),
|
|
194
|
+
}
|
|
195
|
+
if node["type"] == "class":
|
|
196
|
+
element["methods"] = []
|
|
197
|
+
elements.append(element)
|
|
198
|
+
return elements
|
|
199
|
+
|
|
200
|
+
def _build_result(
|
|
201
|
+
self,
|
|
202
|
+
file_path: str,
|
|
203
|
+
language: str,
|
|
204
|
+
final_nodes: List[dict],
|
|
205
|
+
elements: List[dict],
|
|
206
|
+
) -> dict:
|
|
207
|
+
"""Build final result dictionary.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
file_path: File path
|
|
211
|
+
language: Programming language
|
|
212
|
+
final_nodes: List of node dictionaries
|
|
213
|
+
elements: List of element dictionaries
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
Complete result dictionary
|
|
217
|
+
"""
|
|
218
|
+
return {
|
|
219
|
+
"path": file_path,
|
|
220
|
+
"language": language,
|
|
221
|
+
"nodes": final_nodes,
|
|
222
|
+
"elements": elements,
|
|
223
|
+
"complexity": sum(e["complexity"] for e in elements),
|
|
224
|
+
"lines": len(elements),
|
|
225
|
+
"stats": {
|
|
226
|
+
"classes": len([e for e in elements if e["type"] == "class"]),
|
|
227
|
+
"functions": len([e for e in elements if e["type"] == "function"]),
|
|
228
|
+
"methods": len([e for e in elements if e["type"] == "method"]),
|
|
229
|
+
"variables": len([e for e in elements if e["type"] == "variable"]),
|
|
230
|
+
"imports": len([e for e in elements if e["type"] == "import"]),
|
|
231
|
+
"total": len(elements),
|
|
232
|
+
},
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
def _is_internal_node(self, node: CodeNode) -> bool:
|
|
236
|
+
"""Check if node is an internal function that should be filtered.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
node: CodeNode to check
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
True if node should be filtered out
|
|
243
|
+
"""
|
|
244
|
+
# Don't filter classes - always show them
|
|
245
|
+
if node.node_type == "class":
|
|
246
|
+
return False
|
|
247
|
+
|
|
248
|
+
# Don't filter variables or imports - they're useful for tree view
|
|
249
|
+
if node.node_type in ["variable", "import"]:
|
|
250
|
+
return False
|
|
251
|
+
|
|
252
|
+
name_lower = node.name.lower()
|
|
253
|
+
|
|
254
|
+
# Filter only very specific internal patterns
|
|
255
|
+
# Be more conservative - only filter obvious internal handlers
|
|
256
|
+
if name_lower.startswith(("handle_", "on_")):
|
|
257
|
+
return True
|
|
258
|
+
|
|
259
|
+
# Filter Python magic methods except important ones
|
|
260
|
+
if name_lower.startswith("__") and name_lower.endswith("__"):
|
|
261
|
+
# Keep important magic methods
|
|
262
|
+
important_magic = [
|
|
263
|
+
"__init__",
|
|
264
|
+
"__call__",
|
|
265
|
+
"__enter__",
|
|
266
|
+
"__exit__",
|
|
267
|
+
"__str__",
|
|
268
|
+
"__repr__",
|
|
269
|
+
]
|
|
270
|
+
return node.name not in important_magic
|
|
271
|
+
|
|
272
|
+
# Filter very generic getters/setters only if they're trivial
|
|
273
|
+
if (name_lower.startswith(("get_", "set_"))) and len(node.name) <= 8:
|
|
274
|
+
return True
|
|
275
|
+
|
|
276
|
+
# Don't filter single underscore functions - they're often important
|
|
277
|
+
# (like _setup_logging, _validate_input, etc.)
|
|
278
|
+
return False
|
|
279
|
+
|
|
280
|
+
def _get_language(self, file_path: Path) -> str:
|
|
281
|
+
"""Determine language from file extension.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
file_path: Path to file
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
Language string
|
|
288
|
+
"""
|
|
289
|
+
ext = file_path.suffix.lower()
|
|
290
|
+
language_map = {
|
|
291
|
+
".py": "python",
|
|
292
|
+
".js": "javascript",
|
|
293
|
+
".jsx": "javascript",
|
|
294
|
+
".ts": "typescript",
|
|
295
|
+
".tsx": "typescript",
|
|
296
|
+
".mjs": "javascript",
|
|
297
|
+
".cjs": "javascript",
|
|
298
|
+
}
|
|
299
|
+
return language_map.get(ext, "unknown")
|