claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -34,10 +34,7 @@ import contextlib
|
|
|
34
34
|
|
|
35
35
|
from claude_mpm.services.version_service import VersionService
|
|
36
36
|
|
|
37
|
-
from ....core.constants import
|
|
38
|
-
SystemLimits,
|
|
39
|
-
TimeoutConfig,
|
|
40
|
-
)
|
|
37
|
+
from ....core.constants import SystemLimits, TimeoutConfig
|
|
41
38
|
from ....core.logging_config import get_logger
|
|
42
39
|
from ....core.unified_paths import get_project_root, get_scripts_dir
|
|
43
40
|
from ...exceptions import SocketIOServerError as MPMConnectionError
|
|
@@ -274,7 +271,22 @@ class SocketIOServerCore:
|
|
|
274
271
|
"""Handle POST /api/events from hook handlers."""
|
|
275
272
|
try:
|
|
276
273
|
# Parse JSON payload
|
|
277
|
-
|
|
274
|
+
payload = await request.json()
|
|
275
|
+
|
|
276
|
+
# Extract event data from payload (handles both direct and wrapped formats)
|
|
277
|
+
# ConnectionManagerService sends: {"namespace": "...", "event": "...", "data": {...}}
|
|
278
|
+
# Direct hook events may send data directly
|
|
279
|
+
# CRITICAL: Check if payload has the expected event structure (type, subtype, timestamp)
|
|
280
|
+
# If it does, use it directly. Only extract 'data' field if it's a wrapper object.
|
|
281
|
+
if "type" in payload and "subtype" in payload:
|
|
282
|
+
# Payload is already in normalized format, use it directly
|
|
283
|
+
event_data = payload
|
|
284
|
+
elif "data" in payload and isinstance(payload.get("data"), dict):
|
|
285
|
+
# Payload is a wrapper with 'data' field (from ConnectionManagerService)
|
|
286
|
+
event_data = payload["data"]
|
|
287
|
+
else:
|
|
288
|
+
# Fallback: use entire payload
|
|
289
|
+
event_data = payload
|
|
278
290
|
|
|
279
291
|
# Log receipt with more detail
|
|
280
292
|
event_type = (
|
|
@@ -295,38 +307,96 @@ class SocketIOServerCore:
|
|
|
295
307
|
|
|
296
308
|
normalizer = EventNormalizer()
|
|
297
309
|
|
|
310
|
+
# Map hook event names to dashboard subtypes
|
|
311
|
+
# Comprehensive mapping of all known Claude Code hook event types
|
|
312
|
+
subtype_map = {
|
|
313
|
+
# User interaction events
|
|
314
|
+
"UserPromptSubmit": "user_prompt_submit",
|
|
315
|
+
"UserPromptCancel": "user_prompt_cancel",
|
|
316
|
+
# Tool execution events
|
|
317
|
+
"PreToolUse": "pre_tool_use",
|
|
318
|
+
"PostToolUse": "post_tool_use",
|
|
319
|
+
"ToolStart": "tool_start",
|
|
320
|
+
"ToolUse": "tool_use",
|
|
321
|
+
# Assistant events
|
|
322
|
+
"AssistantResponse": "assistant_response",
|
|
323
|
+
# Session lifecycle events
|
|
324
|
+
"Start": "start",
|
|
325
|
+
"Stop": "stop",
|
|
326
|
+
"SessionStart": "session_start",
|
|
327
|
+
# Subagent events
|
|
328
|
+
"SubagentStart": "subagent_start",
|
|
329
|
+
"SubagentStop": "subagent_stop",
|
|
330
|
+
"SubagentEvent": "subagent_event",
|
|
331
|
+
# Task events
|
|
332
|
+
"Task": "task",
|
|
333
|
+
"TaskStart": "task_start",
|
|
334
|
+
"TaskComplete": "task_complete",
|
|
335
|
+
# File operation events
|
|
336
|
+
"FileWrite": "file_write",
|
|
337
|
+
"Write": "write",
|
|
338
|
+
# System events
|
|
339
|
+
"Notification": "notification",
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
# Helper function to convert PascalCase to snake_case
|
|
343
|
+
def to_snake_case(name: str) -> str:
|
|
344
|
+
"""Convert PascalCase event names to snake_case.
|
|
345
|
+
|
|
346
|
+
Examples:
|
|
347
|
+
UserPromptSubmit → user_prompt_submit
|
|
348
|
+
PreToolUse → pre_tool_use
|
|
349
|
+
TaskComplete → task_complete
|
|
350
|
+
"""
|
|
351
|
+
import re
|
|
352
|
+
|
|
353
|
+
return re.sub(r"(?<!^)(?=[A-Z])", "_", name).lower()
|
|
354
|
+
|
|
355
|
+
# Get hook event name and map to subtype
|
|
356
|
+
hook_event_name = event_data.get("hook_event_name", "unknown")
|
|
357
|
+
subtype = subtype_map.get(
|
|
358
|
+
hook_event_name, to_snake_case(hook_event_name)
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
# Debug log for unmapped events to discover new event types
|
|
362
|
+
if (
|
|
363
|
+
hook_event_name not in subtype_map
|
|
364
|
+
and hook_event_name != "unknown"
|
|
365
|
+
):
|
|
366
|
+
self.logger.debug(
|
|
367
|
+
f"Unmapped hook event: {hook_event_name} → {subtype}"
|
|
368
|
+
)
|
|
369
|
+
|
|
298
370
|
# Create the format expected by normalizer
|
|
299
371
|
raw_event = {
|
|
300
372
|
"type": "hook",
|
|
301
|
-
"subtype":
|
|
302
|
-
.lower()
|
|
303
|
-
.replace("submit", "")
|
|
304
|
-
.replace("use", "_use"),
|
|
373
|
+
"subtype": subtype,
|
|
305
374
|
"timestamp": event_data.get("timestamp"),
|
|
306
375
|
"data": event_data.get("hook_input_data", {}),
|
|
307
376
|
"source": "claude_hooks",
|
|
308
377
|
"session_id": event_data.get("session_id"),
|
|
309
378
|
}
|
|
310
379
|
|
|
311
|
-
# Map hook event names to dashboard subtypes
|
|
312
|
-
subtype_map = {
|
|
313
|
-
"UserPromptSubmit": "user_prompt",
|
|
314
|
-
"PreToolUse": "pre_tool",
|
|
315
|
-
"PostToolUse": "post_tool",
|
|
316
|
-
"Stop": "stop",
|
|
317
|
-
"SubagentStop": "subagent_stop",
|
|
318
|
-
"AssistantResponse": "assistant_response",
|
|
319
|
-
}
|
|
320
|
-
raw_event["subtype"] = subtype_map.get(
|
|
321
|
-
event_data.get("hook_event_name"), "unknown"
|
|
322
|
-
)
|
|
323
|
-
|
|
324
380
|
normalized = normalizer.normalize(raw_event, source="hook")
|
|
325
381
|
event_data = normalized.to_dict()
|
|
326
382
|
self.logger.debug(
|
|
327
383
|
f"Normalized event: type={event_data.get('type')}, subtype={event_data.get('subtype')}"
|
|
328
384
|
)
|
|
329
385
|
|
|
386
|
+
# Publish to EventBus for cross-component communication
|
|
387
|
+
# WHY: This allows other parts of the system to react to hook events
|
|
388
|
+
# without coupling to Socket.IO directly
|
|
389
|
+
try:
|
|
390
|
+
from claude_mpm.services.event_bus import EventBus
|
|
391
|
+
|
|
392
|
+
event_bus = EventBus.get_instance()
|
|
393
|
+
event_type = f"hook.{event_data.get('subtype', 'unknown')}"
|
|
394
|
+
event_bus.publish(event_type, event_data)
|
|
395
|
+
self.logger.debug(f"Published to EventBus: {event_type}")
|
|
396
|
+
except Exception as e:
|
|
397
|
+
# Non-fatal: EventBus publication failure shouldn't break event flow
|
|
398
|
+
self.logger.warning(f"Failed to publish to EventBus: {e}")
|
|
399
|
+
|
|
330
400
|
# Broadcast to all connected dashboard clients via SocketIO
|
|
331
401
|
if self.sio:
|
|
332
402
|
# CRITICAL: Use the main server's broadcaster for proper event handling
|
|
@@ -345,9 +415,23 @@ class SocketIOServerCore:
|
|
|
345
415
|
self.event_buffer.append(event_data)
|
|
346
416
|
self.stats["events_buffered"] = len(self.event_buffer)
|
|
347
417
|
|
|
348
|
-
# Add to main server's event history
|
|
349
|
-
|
|
418
|
+
# Add to main server's event history UNCONDITIONALLY
|
|
419
|
+
# WHY: event_history is always initialized in SocketIOServer.__init__
|
|
420
|
+
# This ensures events persist for new clients who connect later
|
|
421
|
+
if self.main_server and hasattr(
|
|
422
|
+
self.main_server, "event_history"
|
|
423
|
+
):
|
|
350
424
|
self.main_server.event_history.append(event_data)
|
|
425
|
+
self.logger.debug(
|
|
426
|
+
f"Added to history (total: {len(self.main_server.event_history)})"
|
|
427
|
+
)
|
|
428
|
+
else:
|
|
429
|
+
# CRITICAL: Log warning if event_history is not available
|
|
430
|
+
# This indicates a configuration or initialization problem
|
|
431
|
+
self.logger.warning(
|
|
432
|
+
"event_history not initialized on main_server! "
|
|
433
|
+
"Events will not persist for new clients."
|
|
434
|
+
)
|
|
351
435
|
|
|
352
436
|
# Use the broadcaster's sio to emit (it's the same as self.sio)
|
|
353
437
|
# This ensures the event goes through the proper channels
|
|
@@ -381,6 +465,21 @@ class SocketIOServerCore:
|
|
|
381
465
|
self.event_buffer.append(event_data)
|
|
382
466
|
self.stats["events_buffered"] = len(self.event_buffer)
|
|
383
467
|
|
|
468
|
+
# Add to main server's event history (fallback path)
|
|
469
|
+
# WHY: Ensure events persist even when broadcaster is unavailable
|
|
470
|
+
if self.main_server and hasattr(
|
|
471
|
+
self.main_server, "event_history"
|
|
472
|
+
):
|
|
473
|
+
self.main_server.event_history.append(event_data)
|
|
474
|
+
self.logger.debug(
|
|
475
|
+
f"Added to history via fallback (total: {len(self.main_server.event_history)})"
|
|
476
|
+
)
|
|
477
|
+
else:
|
|
478
|
+
self.logger.warning(
|
|
479
|
+
"event_history not initialized on main_server (fallback path)! "
|
|
480
|
+
"Events will not persist for new clients."
|
|
481
|
+
)
|
|
482
|
+
|
|
384
483
|
# Return 204 No Content for success
|
|
385
484
|
self.logger.debug(f"✅ HTTP event processed successfully: {event_type}")
|
|
386
485
|
return web.Response(status=204)
|
|
@@ -393,13 +492,54 @@ class SocketIOServerCore:
|
|
|
393
492
|
self.app.router.add_post("/api/events", api_events_handler)
|
|
394
493
|
self.logger.info("✅ HTTP API endpoint registered at /api/events")
|
|
395
494
|
|
|
495
|
+
# Add health check endpoint
|
|
496
|
+
async def health_handler(request):
|
|
497
|
+
"""Handle GET /api/health for health checks."""
|
|
498
|
+
try:
|
|
499
|
+
# Get server status
|
|
500
|
+
uptime_seconds = 0
|
|
501
|
+
if self.stats.get("start_time"):
|
|
502
|
+
uptime_seconds = int(
|
|
503
|
+
(
|
|
504
|
+
datetime.now(timezone.utc) - self.stats["start_time"]
|
|
505
|
+
).total_seconds()
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
health_data = {
|
|
509
|
+
"status": "healthy",
|
|
510
|
+
"service": "claude-mpm-socketio",
|
|
511
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
512
|
+
"uptime_seconds": uptime_seconds,
|
|
513
|
+
"connected_clients": len(self.connected_clients),
|
|
514
|
+
"total_events": self.stats.get("events_sent", 0),
|
|
515
|
+
"buffered_events": self.stats.get("events_buffered", 0),
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
return web.json_response(health_data)
|
|
519
|
+
except Exception as e:
|
|
520
|
+
self.logger.error(f"Error in health check: {e}")
|
|
521
|
+
return web.json_response(
|
|
522
|
+
{
|
|
523
|
+
"status": "unhealthy",
|
|
524
|
+
"service": "claude-mpm-socketio",
|
|
525
|
+
"error": str(e),
|
|
526
|
+
},
|
|
527
|
+
status=503,
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
self.app.router.add_get("/api/health", health_handler)
|
|
531
|
+
self.app.router.add_get("/health", health_handler) # Alias for convenience
|
|
532
|
+
self.logger.info(
|
|
533
|
+
"✅ Health check endpoints registered at /api/health and /health"
|
|
534
|
+
)
|
|
535
|
+
|
|
396
536
|
# Add working directory endpoint
|
|
397
537
|
async def working_directory_handler(request):
|
|
398
538
|
"""Handle GET /api/working-directory to provide current working directory."""
|
|
399
539
|
from pathlib import Path
|
|
400
540
|
|
|
401
541
|
try:
|
|
402
|
-
working_dir = Path.cwd()
|
|
542
|
+
working_dir = str(Path.cwd())
|
|
403
543
|
home_dir = str(Path.home())
|
|
404
544
|
|
|
405
545
|
return web.json_response(
|
|
@@ -489,6 +629,169 @@ class SocketIOServerCore:
|
|
|
489
629
|
self.app.router.add_get("/api/file/read", file_read_handler)
|
|
490
630
|
self.logger.info("✅ File reading API registered at /api/file/read")
|
|
491
631
|
|
|
632
|
+
# Add files listing endpoint for file browser
|
|
633
|
+
async def files_list_handler(request):
|
|
634
|
+
"""Handle GET /api/files for listing files in working directory."""
|
|
635
|
+
|
|
636
|
+
try:
|
|
637
|
+
# Get working directory from query params or use current directory
|
|
638
|
+
working_dir = request.query.get("path", str(Path.cwd()))
|
|
639
|
+
abs_working_dir = Path(working_dir).resolve().expanduser()
|
|
640
|
+
|
|
641
|
+
# Security check - ensure directory is accessible
|
|
642
|
+
if not abs_working_dir.exists():
|
|
643
|
+
return web.json_response(
|
|
644
|
+
{"error": "Directory not found"}, status=404
|
|
645
|
+
)
|
|
646
|
+
|
|
647
|
+
if not abs_working_dir.is_dir():
|
|
648
|
+
return web.json_response(
|
|
649
|
+
{"error": "Path is not a directory"}, status=400
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
# Collect files and directories
|
|
653
|
+
files = []
|
|
654
|
+
directories = []
|
|
655
|
+
|
|
656
|
+
# Common patterns to exclude
|
|
657
|
+
exclude_patterns = {
|
|
658
|
+
".git",
|
|
659
|
+
".venv",
|
|
660
|
+
"venv",
|
|
661
|
+
"node_modules",
|
|
662
|
+
"__pycache__",
|
|
663
|
+
".pytest_cache",
|
|
664
|
+
".mypy_cache",
|
|
665
|
+
"dist",
|
|
666
|
+
"build",
|
|
667
|
+
".next",
|
|
668
|
+
"coverage",
|
|
669
|
+
".coverage",
|
|
670
|
+
".tox",
|
|
671
|
+
".eggs",
|
|
672
|
+
"*.egg-info",
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
for entry in abs_working_dir.iterdir():
|
|
676
|
+
# Skip hidden files and excluded patterns
|
|
677
|
+
if entry.name.startswith("."):
|
|
678
|
+
# Allow .py, .ts, .md, etc. files but skip directories like .git
|
|
679
|
+
if entry.is_dir():
|
|
680
|
+
continue
|
|
681
|
+
|
|
682
|
+
# Skip excluded directories
|
|
683
|
+
if entry.name in exclude_patterns:
|
|
684
|
+
continue
|
|
685
|
+
|
|
686
|
+
try:
|
|
687
|
+
stat_info = entry.stat()
|
|
688
|
+
entry_data = {
|
|
689
|
+
"name": entry.name,
|
|
690
|
+
"path": str(entry),
|
|
691
|
+
"type": "directory" if entry.is_dir() else "file",
|
|
692
|
+
"size": stat_info.st_size if entry.is_file() else 0,
|
|
693
|
+
"modified": stat_info.st_mtime,
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
if entry.is_dir():
|
|
697
|
+
directories.append(entry_data)
|
|
698
|
+
else:
|
|
699
|
+
# Add file extension for syntax highlighting
|
|
700
|
+
entry_data["extension"] = entry.suffix.lower()
|
|
701
|
+
files.append(entry_data)
|
|
702
|
+
except (PermissionError, OSError):
|
|
703
|
+
# Skip files we can't access
|
|
704
|
+
continue
|
|
705
|
+
|
|
706
|
+
# Sort directories and files alphabetically
|
|
707
|
+
directories.sort(key=lambda x: x["name"].lower())
|
|
708
|
+
files.sort(key=lambda x: x["name"].lower())
|
|
709
|
+
|
|
710
|
+
return web.json_response(
|
|
711
|
+
{
|
|
712
|
+
"success": True,
|
|
713
|
+
"path": str(abs_working_dir),
|
|
714
|
+
"directories": directories,
|
|
715
|
+
"files": files,
|
|
716
|
+
"total_files": len(files),
|
|
717
|
+
"total_directories": len(directories),
|
|
718
|
+
}
|
|
719
|
+
)
|
|
720
|
+
|
|
721
|
+
except Exception as e:
|
|
722
|
+
self.logger.error(f"Error listing files: {e}")
|
|
723
|
+
return web.json_response({"error": str(e)}, status=500)
|
|
724
|
+
|
|
725
|
+
self.app.router.add_get("/api/files", files_list_handler)
|
|
726
|
+
self.logger.info("✅ Files listing API registered at /api/files")
|
|
727
|
+
|
|
728
|
+
# Add git history endpoint
|
|
729
|
+
async def git_history_handler(request):
|
|
730
|
+
"""Handle POST /api/git-history for getting file git history."""
|
|
731
|
+
import subprocess
|
|
732
|
+
|
|
733
|
+
try:
|
|
734
|
+
# Parse JSON body
|
|
735
|
+
data = await request.json()
|
|
736
|
+
file_path = data.get("path", "")
|
|
737
|
+
limit = data.get("limit", 10)
|
|
738
|
+
|
|
739
|
+
if not file_path:
|
|
740
|
+
return web.json_response(
|
|
741
|
+
{"success": False, "error": "No path provided", "commits": []},
|
|
742
|
+
status=400,
|
|
743
|
+
)
|
|
744
|
+
|
|
745
|
+
abs_path = Path(Path(file_path).resolve().expanduser())
|
|
746
|
+
|
|
747
|
+
if not Path(abs_path).exists():
|
|
748
|
+
return web.json_response(
|
|
749
|
+
{"success": False, "error": "File not found", "commits": []},
|
|
750
|
+
status=404,
|
|
751
|
+
)
|
|
752
|
+
|
|
753
|
+
# Get git log for file
|
|
754
|
+
result = subprocess.run(
|
|
755
|
+
[
|
|
756
|
+
"git",
|
|
757
|
+
"log",
|
|
758
|
+
f"-{limit}",
|
|
759
|
+
"--pretty=format:%H|%an|%ar|%s",
|
|
760
|
+
"--",
|
|
761
|
+
abs_path,
|
|
762
|
+
],
|
|
763
|
+
check=False,
|
|
764
|
+
capture_output=True,
|
|
765
|
+
text=True,
|
|
766
|
+
cwd=Path(abs_path).parent,
|
|
767
|
+
)
|
|
768
|
+
|
|
769
|
+
commits = []
|
|
770
|
+
if result.returncode == 0 and result.stdout:
|
|
771
|
+
for line in result.stdout.strip().split("\n"):
|
|
772
|
+
if line:
|
|
773
|
+
parts = line.split("|", 3)
|
|
774
|
+
if len(parts) == 4:
|
|
775
|
+
commits.append(
|
|
776
|
+
{
|
|
777
|
+
"hash": parts[0][:7], # Short hash
|
|
778
|
+
"author": parts[1],
|
|
779
|
+
"date": parts[2],
|
|
780
|
+
"message": parts[3],
|
|
781
|
+
}
|
|
782
|
+
)
|
|
783
|
+
|
|
784
|
+
return web.json_response({"success": True, "commits": commits})
|
|
785
|
+
|
|
786
|
+
except Exception as e:
|
|
787
|
+
self.logger.error(f"Error getting git history: {e}")
|
|
788
|
+
return web.json_response(
|
|
789
|
+
{"success": False, "error": str(e), "commits": []}, status=500
|
|
790
|
+
)
|
|
791
|
+
|
|
792
|
+
self.app.router.add_post("/api/git-history", git_history_handler)
|
|
793
|
+
self.logger.info("✅ Git history API registered at /api/git-history")
|
|
794
|
+
|
|
492
795
|
def _setup_directory_api(self):
|
|
493
796
|
"""Setup simple directory listing API.
|
|
494
797
|
|
|
@@ -506,7 +809,7 @@ class SocketIOServerCore:
|
|
|
506
809
|
self.logger.error(f"Failed to setup directory API: {e}")
|
|
507
810
|
|
|
508
811
|
def _setup_static_files(self):
|
|
509
|
-
"""Setup static file serving for the dashboard."""
|
|
812
|
+
"""Setup static file serving for the Svelte dashboard."""
|
|
510
813
|
try:
|
|
511
814
|
# Add debug logging for deployment context
|
|
512
815
|
try:
|
|
@@ -519,65 +822,43 @@ class SocketIOServerCore:
|
|
|
519
822
|
except Exception as e:
|
|
520
823
|
self.logger.debug(f"Could not detect deployment context: {e}")
|
|
521
824
|
|
|
522
|
-
|
|
825
|
+
# Find Svelte build directory
|
|
826
|
+
svelte_build_path = self._find_static_path()
|
|
523
827
|
|
|
524
|
-
if
|
|
525
|
-
self.logger.info(f"✅
|
|
828
|
+
if svelte_build_path and svelte_build_path.exists():
|
|
829
|
+
self.logger.info(f"✅ Svelte dashboard found at: {svelte_build_path}")
|
|
830
|
+
self.dashboard_path = svelte_build_path
|
|
526
831
|
|
|
527
|
-
# Serve index.html at root
|
|
832
|
+
# Serve Svelte index.html at root
|
|
528
833
|
async def index_handler(request):
|
|
529
|
-
index_file =
|
|
834
|
+
index_file = svelte_build_path / "index.html"
|
|
530
835
|
if index_file.exists():
|
|
531
|
-
self.logger.debug(
|
|
836
|
+
self.logger.debug(
|
|
837
|
+
f"Serving Svelte dashboard from: {index_file}"
|
|
838
|
+
)
|
|
532
839
|
return web.FileResponse(index_file)
|
|
533
|
-
self.logger.warning(
|
|
534
|
-
f"Dashboard index.html not found at: {index_file}"
|
|
535
|
-
)
|
|
840
|
+
self.logger.warning(f"Svelte index.html not found at: {index_file}")
|
|
536
841
|
return web.Response(text="Dashboard not available", status=404)
|
|
537
842
|
|
|
538
843
|
self.app.router.add_get("/", index_handler)
|
|
539
844
|
|
|
540
|
-
# Serve
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
if dashboard_template.exists():
|
|
546
|
-
self.logger.debug(
|
|
547
|
-
f"Serving dashboard template from: {dashboard_template}"
|
|
548
|
-
)
|
|
549
|
-
return web.FileResponse(dashboard_template)
|
|
550
|
-
# Fallback to the main index if template doesn't exist
|
|
551
|
-
self.logger.warning(
|
|
552
|
-
f"Dashboard template not found at: {dashboard_template}, falling back to index"
|
|
845
|
+
# Serve Svelte app assets at /_app/ (needed for SvelteKit builds)
|
|
846
|
+
svelte_app_path = svelte_build_path / "_app"
|
|
847
|
+
if svelte_app_path.exists():
|
|
848
|
+
self.app.router.add_static(
|
|
849
|
+
"/_app/", svelte_app_path, name="svelte_app"
|
|
553
850
|
)
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
self.app.router.add_get("/dashboard", dashboard_handler)
|
|
557
|
-
|
|
558
|
-
# Serve simple code view template at /code-simple
|
|
559
|
-
async def code_simple_handler(request):
|
|
560
|
-
code_simple_template = (
|
|
561
|
-
self.dashboard_path.parent / "templates" / "code_simple.html"
|
|
851
|
+
self.logger.info(
|
|
852
|
+
f"✅ Svelte dashboard available at http://{self.host}:{self.port}/ (build: {svelte_build_path})"
|
|
562
853
|
)
|
|
563
|
-
|
|
564
|
-
self.logger.debug(
|
|
565
|
-
f"Serving code simple template from: {code_simple_template}"
|
|
566
|
-
)
|
|
567
|
-
return web.FileResponse(code_simple_template)
|
|
568
|
-
# Return error if template doesn't exist
|
|
854
|
+
else:
|
|
569
855
|
self.logger.warning(
|
|
570
|
-
f"
|
|
571
|
-
)
|
|
572
|
-
return web.Response(
|
|
573
|
-
text="Simple code view not available", status=404
|
|
856
|
+
f"⚠️ Svelte _app directory not found at: {svelte_app_path}"
|
|
574
857
|
)
|
|
575
858
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
# Serve version.json from dashboard directory
|
|
859
|
+
# Serve version.json from Svelte build directory
|
|
579
860
|
async def version_handler(request):
|
|
580
|
-
version_file =
|
|
861
|
+
version_file = svelte_build_path / "version.json"
|
|
581
862
|
if version_file.exists():
|
|
582
863
|
self.logger.debug(f"Serving version.json from: {version_file}")
|
|
583
864
|
return web.FileResponse(version_file)
|
|
@@ -593,24 +874,10 @@ class SocketIOServerCore:
|
|
|
593
874
|
|
|
594
875
|
self.app.router.add_get("/version.json", version_handler)
|
|
595
876
|
|
|
596
|
-
# Serve static assets (CSS, JS) from the dashboard static directory
|
|
597
|
-
dashboard_static_path = (
|
|
598
|
-
get_project_root() / "src" / "claude_mpm" / "dashboard" / "static"
|
|
599
|
-
)
|
|
600
|
-
if dashboard_static_path.exists():
|
|
601
|
-
self.app.router.add_static(
|
|
602
|
-
"/static/", dashboard_static_path, name="dashboard_static"
|
|
603
|
-
)
|
|
604
|
-
self.logger.info(
|
|
605
|
-
f"✅ Static assets available at: {dashboard_static_path}"
|
|
606
|
-
)
|
|
607
|
-
else:
|
|
608
|
-
self.logger.warning(
|
|
609
|
-
f"⚠️ Static assets directory not found at: {dashboard_static_path}"
|
|
610
|
-
)
|
|
611
|
-
|
|
612
877
|
else:
|
|
613
|
-
self.logger.warning(
|
|
878
|
+
self.logger.warning(
|
|
879
|
+
"⚠️ Svelte dashboard not found, serving fallback response"
|
|
880
|
+
)
|
|
614
881
|
|
|
615
882
|
# Fallback handler
|
|
616
883
|
async def fallback_handler(request):
|
|
@@ -637,10 +904,10 @@ class SocketIOServerCore:
|
|
|
637
904
|
self.app.router.add_get("/", error_handler)
|
|
638
905
|
|
|
639
906
|
def _find_static_path(self):
|
|
640
|
-
"""Find the
|
|
907
|
+
"""Find the Svelte build directory using multiple approaches.
|
|
641
908
|
|
|
642
|
-
WHY: The
|
|
643
|
-
|
|
909
|
+
WHY: The dashboard is now pure Svelte, located at dashboard/static/svelte-build/.
|
|
910
|
+
We search for this specific structure across different deployment contexts.
|
|
644
911
|
"""
|
|
645
912
|
# Get deployment-context-aware paths
|
|
646
913
|
try:
|
|
@@ -661,43 +928,45 @@ class SocketIOServerCore:
|
|
|
661
928
|
package_root = None
|
|
662
929
|
project_root = get_project_root()
|
|
663
930
|
|
|
664
|
-
# Try multiple possible locations for
|
|
931
|
+
# Try multiple possible locations for Svelte build directory
|
|
665
932
|
possible_paths = [
|
|
666
933
|
# Package-based paths (for pipx and pip installations)
|
|
667
|
-
package_root / "dashboard" / "
|
|
668
|
-
|
|
669
|
-
|
|
934
|
+
package_root / "dashboard" / "static" / "svelte-build"
|
|
935
|
+
if package_root
|
|
936
|
+
else None,
|
|
670
937
|
# Project-based paths (for development)
|
|
671
|
-
project_root
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
938
|
+
project_root
|
|
939
|
+
/ "src"
|
|
940
|
+
/ "claude_mpm"
|
|
941
|
+
/ "dashboard"
|
|
942
|
+
/ "static"
|
|
943
|
+
/ "svelte-build",
|
|
944
|
+
project_root / "dashboard" / "static" / "svelte-build",
|
|
677
945
|
# Package installation locations (fallback)
|
|
678
|
-
Path(__file__).parent.parent
|
|
679
|
-
|
|
946
|
+
Path(__file__).parent.parent.parent
|
|
947
|
+
/ "dashboard"
|
|
948
|
+
/ "static"
|
|
949
|
+
/ "svelte-build",
|
|
680
950
|
# Scripts directory (for standalone installations)
|
|
681
|
-
get_scripts_dir() / "static",
|
|
682
|
-
get_scripts_dir() / "socketio" / "static",
|
|
951
|
+
get_scripts_dir() / "dashboard" / "static" / "svelte-build",
|
|
683
952
|
# Current working directory
|
|
684
|
-
Path.cwd() / "static",
|
|
685
|
-
Path.cwd() / "
|
|
953
|
+
Path.cwd() / "src" / "claude_mpm" / "dashboard" / "static" / "svelte-build",
|
|
954
|
+
Path.cwd() / "dashboard" / "static" / "svelte-build",
|
|
686
955
|
]
|
|
687
956
|
|
|
688
957
|
# Filter out None values
|
|
689
958
|
possible_paths = [p for p in possible_paths if p is not None]
|
|
690
959
|
self.logger.debug(
|
|
691
|
-
f"Searching {len(possible_paths)} possible
|
|
960
|
+
f"Searching {len(possible_paths)} possible Svelte build locations"
|
|
692
961
|
)
|
|
693
962
|
|
|
694
963
|
for path in possible_paths:
|
|
695
|
-
self.logger.debug(f"Checking for
|
|
964
|
+
self.logger.debug(f"Checking for Svelte build at: {path}")
|
|
696
965
|
try:
|
|
697
966
|
if path.exists() and path.is_dir():
|
|
698
|
-
# Check if it contains expected files
|
|
967
|
+
# Check if it contains expected Svelte build files
|
|
699
968
|
if (path / "index.html").exists():
|
|
700
|
-
self.logger.info(f"✅ Found
|
|
969
|
+
self.logger.info(f"✅ Found Svelte build at: {path}")
|
|
701
970
|
return path
|
|
702
971
|
self.logger.debug(f"Directory exists but no index.html: {path}")
|
|
703
972
|
else:
|
|
@@ -706,7 +975,7 @@ class SocketIOServerCore:
|
|
|
706
975
|
self.logger.debug(f"Error checking path {path}: {e}")
|
|
707
976
|
|
|
708
977
|
self.logger.warning(
|
|
709
|
-
"⚠️
|
|
978
|
+
"⚠️ Svelte build not found - dashboard will not be available"
|
|
710
979
|
)
|
|
711
980
|
self.logger.debug(f"Searched paths: {[str(p) for p in possible_paths]}")
|
|
712
981
|
return None
|
|
@@ -782,9 +1051,15 @@ class SocketIOServerCore:
|
|
|
782
1051
|
},
|
|
783
1052
|
}
|
|
784
1053
|
|
|
785
|
-
# Add to event history
|
|
1054
|
+
# Add to event history UNCONDITIONALLY
|
|
1055
|
+
# WHY: Heartbeat events should persist for new clients too
|
|
786
1056
|
if self.main_server and hasattr(self.main_server, "event_history"):
|
|
787
1057
|
self.main_server.event_history.append(heartbeat_data)
|
|
1058
|
+
self.logger.debug(
|
|
1059
|
+
f"Heartbeat added to history (total: {len(self.main_server.event_history)})"
|
|
1060
|
+
)
|
|
1061
|
+
else:
|
|
1062
|
+
self.logger.warning("event_history not initialized for heartbeat!")
|
|
788
1063
|
|
|
789
1064
|
# Emit heartbeat to all connected clients (already using new schema)
|
|
790
1065
|
await self.sio.emit("system_event", heartbeat_data)
|
|
@@ -30,9 +30,7 @@ except ImportError:
|
|
|
30
30
|
aiohttp = None
|
|
31
31
|
web = None
|
|
32
32
|
|
|
33
|
-
from ....core.constants import
|
|
34
|
-
SystemLimits,
|
|
35
|
-
)
|
|
33
|
+
from ....core.constants import SystemLimits
|
|
36
34
|
from ....core.logging_config import get_logger
|
|
37
35
|
from ...core.interfaces.communication import SocketIOServiceInterface
|
|
38
36
|
from ..handlers import EventHandlerRegistry, FileEventHandler, GitEventHandler
|