claude-mpm 4.21.3__py3-none-any.whl → 5.0.2__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- 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 +38 -2
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +125 -20
- claude_mpm/cli/commands/agents.py +684 -13
- 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 +2 -6
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +478 -44
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- 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 +50 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +435 -1
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +919 -41
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +173 -4
- claude_mpm/cli/parsers/base_parser.py +49 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +138 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +499 -84
- 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-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +11 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +258 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +12 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +17 -10
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +112 -5
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +94 -4
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- 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/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -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/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -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 +236 -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 +115 -15
- 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 +363 -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 +629 -0
- 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/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 +1055 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +92 -1
- 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 +0 -2
- 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/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/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -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 +494 -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/infrastructure/monitoring/resources.py +1 -1
- 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/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -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/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- 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/cloud_strategies.py +1 -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/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- 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/tools/code_tree_analyzer/analysis.py +1 -1
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/progress.py +383 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +252 -425
- 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 -180
- 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 -211
- 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/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 -140
- 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 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- 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/ticketing.json +0 -177
- 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 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- 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/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/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/stores/dashboard-store.js +0 -562
- 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/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/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/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.21.3.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"""Instruction cache service for managing assembled PM instruction content.
|
|
2
|
+
|
|
3
|
+
WHY: Linux systems have ARG_MAX limits (~128-256KB) that prevent passing
|
|
4
|
+
assembled PM instructions (~450KB) via CLI arguments. This service caches
|
|
5
|
+
the complete assembled instruction content to a file that Claude Code can
|
|
6
|
+
load directly.
|
|
7
|
+
|
|
8
|
+
DESIGN DECISION: Cache FULL assembled instruction content (BASE_PM + PM_INSTRUCTIONS
|
|
9
|
+
+ WORKFLOW + capabilities + temporal context) rather than single source file.
|
|
10
|
+
Uses SHA-256 hash-based invalidation to update cache only when assembled content
|
|
11
|
+
changes. This avoids unnecessary file I/O while ensuring cache stays synchronized.
|
|
12
|
+
|
|
13
|
+
Trade-offs:
|
|
14
|
+
- Performance: Hash computation adds ~1ms overhead but saves 450KB arg passing
|
|
15
|
+
- Complexity: Content-based hashing vs. multi-file dependency tracking
|
|
16
|
+
- Reliability: Hash-based validation is deterministic and platform-independent
|
|
17
|
+
- Flexibility: Caller assembles content, service only caches (separation of concerns)
|
|
18
|
+
|
|
19
|
+
Alternatives Considered:
|
|
20
|
+
1. File-based tracking: Rejected - can't detect changes in dynamic components
|
|
21
|
+
2. Multi-file dependency tracking: Rejected - complex and error-prone
|
|
22
|
+
3. No caching (always pass via CLI): Rejected due to Linux ARG_MAX limits
|
|
23
|
+
4. Database caching: Rejected as overkill for single-content caching
|
|
24
|
+
|
|
25
|
+
Extension Points:
|
|
26
|
+
- Compression: Add gzip compression if content sizes grow beyond disk constraints
|
|
27
|
+
- Multiple cache slots: Support caching different agent instruction sets
|
|
28
|
+
- TTL-based invalidation: Add time-based expiration for dynamic content
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
import hashlib
|
|
32
|
+
import json
|
|
33
|
+
from datetime import datetime, timezone
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
from typing import Any, Dict, Optional
|
|
36
|
+
|
|
37
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
38
|
+
|
|
39
|
+
logger = get_logger(__name__)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class InstructionCacheService:
|
|
43
|
+
"""Manages cached assembled PM instruction content for file-based loading.
|
|
44
|
+
|
|
45
|
+
The cache is stored at `.claude-mpm/PM_INSTRUCTIONS.md` and includes
|
|
46
|
+
a metadata file `.claude-mpm/PM_INSTRUCTIONS.md.meta` containing:
|
|
47
|
+
- content_hash: SHA-256 of assembled instruction content
|
|
48
|
+
- content_size_bytes: Size of cached content in bytes
|
|
49
|
+
- content_type: Type identifier ("assembled_instruction")
|
|
50
|
+
- components: List of instruction components that were assembled
|
|
51
|
+
- cached_at: ISO timestamp of cache creation
|
|
52
|
+
- version: Cache format version
|
|
53
|
+
|
|
54
|
+
Cache Updates:
|
|
55
|
+
- Triggered during agent deployment or interactive sessions
|
|
56
|
+
- Accepts pre-assembled instruction content from caller
|
|
57
|
+
- Only updates if content hash changes
|
|
58
|
+
- Atomic writes to prevent partial updates
|
|
59
|
+
- Graceful error handling (deployment continues on cache failure)
|
|
60
|
+
|
|
61
|
+
Performance:
|
|
62
|
+
- Hash computation: O(n) where n = content size, ~1ms for 450KB content
|
|
63
|
+
- Cache validation: O(1) metadata read + O(n) hash computation
|
|
64
|
+
- Update operation: O(n) content write, atomic via temp file
|
|
65
|
+
|
|
66
|
+
Error Handling:
|
|
67
|
+
- All methods return result dicts instead of raising exceptions
|
|
68
|
+
- Errors are logged but don't propagate to callers
|
|
69
|
+
- Graceful degradation: Cache failures don't break deployments
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
CACHE_DIR = ".claude-mpm"
|
|
73
|
+
CACHE_FILENAME = "PM_INSTRUCTIONS.md"
|
|
74
|
+
META_FILENAME = "PM_INSTRUCTIONS.md.meta"
|
|
75
|
+
CACHE_VERSION = "1.0"
|
|
76
|
+
|
|
77
|
+
def __init__(self, project_root: Optional[Path] = None) -> None:
|
|
78
|
+
"""Initialize instruction cache service.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
project_root: Project root directory. If None, uses current directory.
|
|
82
|
+
"""
|
|
83
|
+
self.project_root = project_root or Path.cwd()
|
|
84
|
+
self.cache_dir = self.project_root / self.CACHE_DIR
|
|
85
|
+
self.cache_file = self.cache_dir / self.CACHE_FILENAME
|
|
86
|
+
self.meta_file = self.cache_dir / self.META_FILENAME
|
|
87
|
+
self.logger = get_logger(__name__)
|
|
88
|
+
|
|
89
|
+
def update_cache(
|
|
90
|
+
self, instruction_content: str, force: bool = False
|
|
91
|
+
) -> Dict[str, Any]:
|
|
92
|
+
"""Update cache with assembled instruction content.
|
|
93
|
+
|
|
94
|
+
This method implements atomic cache updates using a temp file strategy:
|
|
95
|
+
1. Calculate content hash
|
|
96
|
+
2. Compare with cached hash (if exists)
|
|
97
|
+
3. If different or force=True, write content to temp file
|
|
98
|
+
4. Atomically replace cache with temp file
|
|
99
|
+
5. Write metadata with new hash
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
instruction_content: Complete assembled instruction content
|
|
103
|
+
(BASE_PM + PM_INSTRUCTIONS + WORKFLOW + capabilities + temporal context)
|
|
104
|
+
force: Force update even if hash matches
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Result dictionary with:
|
|
108
|
+
- updated: Whether cache was updated
|
|
109
|
+
- reason: Why update occurred or was skipped
|
|
110
|
+
- cache_path: Path to cache file
|
|
111
|
+
- content_hash: SHA-256 hash of content
|
|
112
|
+
- content_size_kb: Size of content in KB
|
|
113
|
+
|
|
114
|
+
Error Handling:
|
|
115
|
+
Does NOT raise exceptions - returns error in result dict.
|
|
116
|
+
This ensures cache failures don't break agent deployments.
|
|
117
|
+
|
|
118
|
+
Example:
|
|
119
|
+
>>> service = InstructionCacheService()
|
|
120
|
+
>>> assembled = "# BASE_PM\\n...\\n# PM_INSTRUCTIONS\\n..."
|
|
121
|
+
>>> result = service.update_cache(instruction_content=assembled)
|
|
122
|
+
>>> if result["updated"]:
|
|
123
|
+
... print(f"Cache updated: {result['reason']}")
|
|
124
|
+
"""
|
|
125
|
+
try:
|
|
126
|
+
# Ensure cache directory exists
|
|
127
|
+
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
|
128
|
+
|
|
129
|
+
# Calculate content hash
|
|
130
|
+
content_hash = self._calculate_hash_from_content(instruction_content)
|
|
131
|
+
|
|
132
|
+
# Check if update needed
|
|
133
|
+
if not force and self.is_cache_valid(instruction_content):
|
|
134
|
+
return {
|
|
135
|
+
"updated": False,
|
|
136
|
+
"reason": "cache_valid",
|
|
137
|
+
"cache_path": str(self.cache_file),
|
|
138
|
+
"content_hash": content_hash,
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
# Write content to cache (atomic operation)
|
|
142
|
+
temp_file = self.cache_file.with_suffix(".tmp")
|
|
143
|
+
temp_file.write_text(instruction_content, encoding="utf-8")
|
|
144
|
+
temp_file.replace(self.cache_file)
|
|
145
|
+
|
|
146
|
+
# Write metadata
|
|
147
|
+
self._write_metadata(content_hash, len(instruction_content))
|
|
148
|
+
|
|
149
|
+
self.logger.info(f"Updated instruction cache: {self.cache_file}")
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
"updated": True,
|
|
153
|
+
"reason": "content_changed" if not force else "forced",
|
|
154
|
+
"cache_path": str(self.cache_file),
|
|
155
|
+
"content_hash": content_hash,
|
|
156
|
+
"content_size_kb": len(instruction_content) / 1024,
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
except Exception as e:
|
|
160
|
+
self.logger.error(f"Failed to update instruction cache: {e}")
|
|
161
|
+
return {
|
|
162
|
+
"updated": False,
|
|
163
|
+
"reason": "error",
|
|
164
|
+
"error": str(e),
|
|
165
|
+
"cache_path": str(self.cache_file),
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
def get_cache_path(self) -> Path:
|
|
169
|
+
"""Get path to cache file.
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
Path to PM_INSTRUCTIONS.md cache
|
|
173
|
+
|
|
174
|
+
Example:
|
|
175
|
+
>>> service = InstructionCacheService()
|
|
176
|
+
>>> cache_path = service.get_cache_path()
|
|
177
|
+
>>> print(cache_path) # .claude-mpm/PM_INSTRUCTIONS.md
|
|
178
|
+
"""
|
|
179
|
+
return self.cache_file
|
|
180
|
+
|
|
181
|
+
def is_cache_valid(self, instruction_content: str) -> bool:
|
|
182
|
+
"""Check if cache matches current assembled content.
|
|
183
|
+
|
|
184
|
+
Validation checks:
|
|
185
|
+
1. Cache file exists
|
|
186
|
+
2. Metadata file exists
|
|
187
|
+
3. Content hash matches cached hash
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
instruction_content: Current assembled instruction to validate against
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
True if cache exists and hash matches content
|
|
194
|
+
|
|
195
|
+
Example:
|
|
196
|
+
>>> service = InstructionCacheService()
|
|
197
|
+
>>> assembled = "# BASE_PM\\n...\\n# PM_INSTRUCTIONS\\n..."
|
|
198
|
+
>>> if not service.is_cache_valid(assembled):
|
|
199
|
+
... service.update_cache(assembled)
|
|
200
|
+
"""
|
|
201
|
+
try:
|
|
202
|
+
if not self.cache_file.exists() or not self.meta_file.exists():
|
|
203
|
+
return False
|
|
204
|
+
|
|
205
|
+
content_hash = self._calculate_hash_from_content(instruction_content)
|
|
206
|
+
cached_hash = self._get_cached_hash()
|
|
207
|
+
|
|
208
|
+
return content_hash == cached_hash
|
|
209
|
+
|
|
210
|
+
except Exception as e:
|
|
211
|
+
self.logger.debug(f"Cache validation failed: {e}")
|
|
212
|
+
return False
|
|
213
|
+
|
|
214
|
+
def invalidate_cache(self) -> bool:
|
|
215
|
+
"""Invalidate cache by removing cache files.
|
|
216
|
+
|
|
217
|
+
This method removes both the cache file and metadata file,
|
|
218
|
+
forcing a fresh cache creation on next update.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
True if cache was invalidated (files removed), False otherwise
|
|
222
|
+
|
|
223
|
+
Example:
|
|
224
|
+
>>> service = InstructionCacheService()
|
|
225
|
+
>>> if service.invalidate_cache():
|
|
226
|
+
... print("Cache cleared")
|
|
227
|
+
"""
|
|
228
|
+
try:
|
|
229
|
+
removed = False
|
|
230
|
+
if self.cache_file.exists():
|
|
231
|
+
self.cache_file.unlink()
|
|
232
|
+
removed = True
|
|
233
|
+
if self.meta_file.exists():
|
|
234
|
+
self.meta_file.unlink()
|
|
235
|
+
removed = True
|
|
236
|
+
|
|
237
|
+
if removed:
|
|
238
|
+
self.logger.info("Invalidated instruction cache")
|
|
239
|
+
|
|
240
|
+
return removed
|
|
241
|
+
|
|
242
|
+
except Exception as e:
|
|
243
|
+
self.logger.error(f"Failed to invalidate cache: {e}")
|
|
244
|
+
return False
|
|
245
|
+
|
|
246
|
+
def get_cache_info(self) -> Dict[str, Any]:
|
|
247
|
+
"""Get information about current cache state.
|
|
248
|
+
|
|
249
|
+
Returns cache metadata including existence, sizes, and timestamps
|
|
250
|
+
for debugging and monitoring. Note: cannot validate cache without
|
|
251
|
+
current content, so cache_valid is always None.
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
Dictionary with cache metadata:
|
|
255
|
+
- cache_exists: Whether cache file exists
|
|
256
|
+
- cache_path: Path to cache file
|
|
257
|
+
- cache_valid: Always None (validation requires current content)
|
|
258
|
+
- content_type: Type of cached content ("assembled_instruction")
|
|
259
|
+
- cache_size_kb: Cache file size in KB (if exists)
|
|
260
|
+
- cached_at: Cache creation timestamp (if exists)
|
|
261
|
+
- content_hash: Content hash (if cache exists)
|
|
262
|
+
- content_size_bytes: Cached content size in bytes (if exists)
|
|
263
|
+
- components: List of instruction components (if exists)
|
|
264
|
+
|
|
265
|
+
Example:
|
|
266
|
+
>>> service = InstructionCacheService()
|
|
267
|
+
>>> info = service.get_cache_info()
|
|
268
|
+
>>> print(f"Cache exists: {info['cache_exists']}")
|
|
269
|
+
>>> print(f"Size: {info.get('cache_size_kb', 0):.1f}KB")
|
|
270
|
+
"""
|
|
271
|
+
info: Dict[str, Any] = {
|
|
272
|
+
"cache_exists": self.cache_file.exists(),
|
|
273
|
+
"cache_path": str(self.cache_file),
|
|
274
|
+
"cache_valid": None, # Can't validate without current content
|
|
275
|
+
"content_type": "assembled_instruction",
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
try:
|
|
279
|
+
if self.cache_file.exists():
|
|
280
|
+
info["cache_size_kb"] = self.cache_file.stat().st_size / 1024
|
|
281
|
+
|
|
282
|
+
# Load metadata
|
|
283
|
+
if self.meta_file.exists():
|
|
284
|
+
meta = json.loads(self.meta_file.read_text())
|
|
285
|
+
info.update(
|
|
286
|
+
{
|
|
287
|
+
"cached_at": meta.get("cached_at"),
|
|
288
|
+
"content_hash": meta.get("content_hash"),
|
|
289
|
+
"content_size_bytes": meta.get("content_size_bytes"),
|
|
290
|
+
"components": meta.get("components", []),
|
|
291
|
+
"cache_version": meta.get("version"),
|
|
292
|
+
}
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
except Exception as e:
|
|
296
|
+
info["error"] = str(e)
|
|
297
|
+
|
|
298
|
+
return info
|
|
299
|
+
|
|
300
|
+
def _calculate_hash_from_content(self, content: str) -> str:
|
|
301
|
+
"""Calculate SHA-256 hash of content string.
|
|
302
|
+
|
|
303
|
+
Args:
|
|
304
|
+
content: String content to hash
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
Hex digest of SHA-256 hash
|
|
308
|
+
|
|
309
|
+
Performance:
|
|
310
|
+
- Time complexity: O(n) where n = content size
|
|
311
|
+
- Memory usage: O(1) - hash computed incrementally
|
|
312
|
+
"""
|
|
313
|
+
sha256 = hashlib.sha256()
|
|
314
|
+
sha256.update(content.encode("utf-8"))
|
|
315
|
+
return sha256.hexdigest()
|
|
316
|
+
|
|
317
|
+
def _get_cached_hash(self) -> Optional[str]:
|
|
318
|
+
"""Get cached content hash from metadata.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
Cached hash or None if not available
|
|
322
|
+
"""
|
|
323
|
+
try:
|
|
324
|
+
if not self.meta_file.exists():
|
|
325
|
+
return None
|
|
326
|
+
|
|
327
|
+
meta = json.loads(self.meta_file.read_text())
|
|
328
|
+
return meta.get("content_hash")
|
|
329
|
+
|
|
330
|
+
except Exception as e:
|
|
331
|
+
self.logger.debug(f"Failed to read cached hash: {e}")
|
|
332
|
+
return None
|
|
333
|
+
|
|
334
|
+
def _write_metadata(self, content_hash: str, content_size: int) -> None:
|
|
335
|
+
"""Write cache metadata file.
|
|
336
|
+
|
|
337
|
+
Metadata includes:
|
|
338
|
+
- version: Cache format version (for future compatibility)
|
|
339
|
+
- content_type: Type identifier ("assembled_instruction")
|
|
340
|
+
- content_hash: SHA-256 hash of assembled content
|
|
341
|
+
- content_size_bytes: Size of cached content in bytes
|
|
342
|
+
- components: List of instruction components that were assembled
|
|
343
|
+
- cached_at: ISO 8601 timestamp with UTC timezone
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
content_hash: SHA-256 hash of assembled content
|
|
347
|
+
content_size: Size of content in bytes
|
|
348
|
+
|
|
349
|
+
Example metadata:
|
|
350
|
+
{
|
|
351
|
+
"version": "1.0",
|
|
352
|
+
"content_type": "assembled_instruction",
|
|
353
|
+
"content_hash": "abc123...",
|
|
354
|
+
"content_size_bytes": 450000,
|
|
355
|
+
"components": ["BASE_PM.md", "PM_INSTRUCTIONS.md", ...],
|
|
356
|
+
"cached_at": "2025-11-30T15:30:00Z"
|
|
357
|
+
}
|
|
358
|
+
"""
|
|
359
|
+
metadata = {
|
|
360
|
+
"version": self.CACHE_VERSION,
|
|
361
|
+
"content_type": "assembled_instruction",
|
|
362
|
+
"components": [
|
|
363
|
+
"BASE_PM.md",
|
|
364
|
+
"PM_INSTRUCTIONS.md",
|
|
365
|
+
"WORKFLOW.md",
|
|
366
|
+
"agent_capabilities",
|
|
367
|
+
"temporal_context",
|
|
368
|
+
],
|
|
369
|
+
"content_hash": content_hash,
|
|
370
|
+
"content_size_bytes": content_size,
|
|
371
|
+
"cached_at": datetime.now(timezone.utc).isoformat(),
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
self.meta_file.write_text(json.dumps(metadata, indent=2))
|
|
@@ -60,10 +60,7 @@ Note: ProcessStatus has been consolidated into ServiceState (core.enums) as of P
|
|
|
60
60
|
|
|
61
61
|
# Re-export data models and interfaces for convenience
|
|
62
62
|
from claude_mpm.core.enums import HealthStatus
|
|
63
|
-
from claude_mpm.services.core.interfaces.health import
|
|
64
|
-
IHealthCheck,
|
|
65
|
-
IHealthCheckManager,
|
|
66
|
-
)
|
|
63
|
+
from claude_mpm.services.core.interfaces.health import IHealthCheck, IHealthCheckManager
|
|
67
64
|
from claude_mpm.services.core.interfaces.process import (
|
|
68
65
|
IDeploymentStateManager,
|
|
69
66
|
ILocalProcessManager,
|
|
@@ -78,10 +75,7 @@ from claude_mpm.services.core.interfaces.stability import (
|
|
|
78
75
|
IMemoryLeakDetector,
|
|
79
76
|
IResourceMonitor,
|
|
80
77
|
)
|
|
81
|
-
from claude_mpm.services.core.models.health import
|
|
82
|
-
DeploymentHealth,
|
|
83
|
-
HealthCheckResult,
|
|
84
|
-
)
|
|
78
|
+
from claude_mpm.services.core.models.health import DeploymentHealth, HealthCheckResult
|
|
85
79
|
from claude_mpm.services.core.models.process import (
|
|
86
80
|
PROTECTED_PORT_RANGES,
|
|
87
81
|
DeploymentState,
|
|
@@ -106,11 +100,7 @@ from claude_mpm.services.core.models.stability import (
|
|
|
106
100
|
from .health_manager import HealthCheckManager
|
|
107
101
|
from .log_monitor import LogMonitor
|
|
108
102
|
from .memory_leak_detector import MemoryLeakDetector
|
|
109
|
-
from .process_manager import
|
|
110
|
-
LocalProcessManager,
|
|
111
|
-
PortConflictError,
|
|
112
|
-
ProcessSpawnError,
|
|
113
|
-
)
|
|
103
|
+
from .process_manager import LocalProcessManager, PortConflictError, ProcessSpawnError
|
|
114
104
|
from .resource_monitor import ResourceMonitor
|
|
115
105
|
from .state_manager import DeploymentStateManager, StateCorruptionError
|
|
116
106
|
from .unified_manager import UnifiedLocalOpsManager
|
|
@@ -14,9 +14,7 @@ ARCHITECTURE:
|
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
from claude_mpm.services.local_ops.health_checks.http_check import HttpHealthCheck
|
|
17
|
-
from claude_mpm.services.local_ops.health_checks.process_check import
|
|
18
|
-
ProcessHealthCheck,
|
|
19
|
-
)
|
|
17
|
+
from claude_mpm.services.local_ops.health_checks.process_check import ProcessHealthCheck
|
|
20
18
|
from claude_mpm.services.local_ops.health_checks.resource_check import (
|
|
21
19
|
ResourceHealthCheck,
|
|
22
20
|
)
|
|
@@ -43,10 +43,7 @@ from claude_mpm.core.enums import HealthStatus
|
|
|
43
43
|
from claude_mpm.services.core.base import SyncBaseService
|
|
44
44
|
from claude_mpm.services.core.interfaces.health import IHealthCheckManager
|
|
45
45
|
from claude_mpm.services.core.interfaces.process import ILocalProcessManager
|
|
46
|
-
from claude_mpm.services.core.models.health import
|
|
47
|
-
DeploymentHealth,
|
|
48
|
-
HealthCheckResult,
|
|
49
|
-
)
|
|
46
|
+
from claude_mpm.services.core.models.health import DeploymentHealth, HealthCheckResult
|
|
50
47
|
from claude_mpm.services.local_ops.health_checks import (
|
|
51
48
|
HttpHealthCheck,
|
|
52
49
|
ProcessHealthCheck,
|
|
@@ -187,7 +187,7 @@ class LocalProcessManager(SyncBaseService, ILocalProcessManager):
|
|
|
187
187
|
# Check if process is still running
|
|
188
188
|
if process.poll() is not None:
|
|
189
189
|
# Process died immediately
|
|
190
|
-
|
|
190
|
+
_stdout, stderr = process.communicate()
|
|
191
191
|
error_msg = stderr.decode("utf-8", errors="replace") if stderr else ""
|
|
192
192
|
raise ProcessSpawnError(
|
|
193
193
|
f"Process died immediately. Exit code: {process.returncode}. "
|
|
@@ -102,7 +102,7 @@ class ResourceMonitor(SyncBaseService, IResourceMonitor):
|
|
|
102
102
|
self._initialized = True
|
|
103
103
|
self.log_info(
|
|
104
104
|
f"Resource monitor initialized "
|
|
105
|
-
f"(fd_threshold={self.fd_threshold_percent*100:.0f}%, "
|
|
105
|
+
f"(fd_threshold={self.fd_threshold_percent * 100:.0f}%, "
|
|
106
106
|
f"thread_threshold={self.thread_threshold}, "
|
|
107
107
|
f"connection_threshold={self.connection_threshold}, "
|
|
108
108
|
f"disk_threshold={self.disk_threshold_mb}MB)"
|
|
@@ -304,7 +304,7 @@ class ResourceMonitor(SyncBaseService, IResourceMonitor):
|
|
|
304
304
|
return 0
|
|
305
305
|
|
|
306
306
|
try:
|
|
307
|
-
soft_limit,
|
|
307
|
+
soft_limit, _hard_limit = resource_module.getrlimit(
|
|
308
308
|
resource_module.RLIMIT_NOFILE
|
|
309
309
|
)
|
|
310
310
|
return soft_limit
|
|
@@ -215,7 +215,7 @@ class MCPConfiguration(BaseMCPService, IMCPConfiguration):
|
|
|
215
215
|
current[part] = {}
|
|
216
216
|
elif not isinstance(current[part], dict):
|
|
217
217
|
self.log_warning(
|
|
218
|
-
f"Cannot override non-dict config at {'.'.join(config_path[:i+1])}"
|
|
218
|
+
f"Cannot override non-dict config at {'.'.join(config_path[: i + 1])}"
|
|
219
219
|
)
|
|
220
220
|
break
|
|
221
221
|
current = current[part]
|
|
@@ -21,12 +21,7 @@ from typing import Any, Callable, Dict, List, Optional, Union
|
|
|
21
21
|
|
|
22
22
|
# Import from the official MCP package
|
|
23
23
|
from mcp.server import Server
|
|
24
|
-
from mcp.types import
|
|
25
|
-
EmbeddedResource,
|
|
26
|
-
ImageContent,
|
|
27
|
-
TextContent,
|
|
28
|
-
Tool,
|
|
29
|
-
)
|
|
24
|
+
from mcp.types import EmbeddedResource, ImageContent, TextContent, Tool
|
|
30
25
|
|
|
31
26
|
from claude_mpm.services.mcp_gateway.core.base import BaseMCPService
|
|
32
27
|
from claude_mpm.services.mcp_gateway.core.interfaces import (
|
|
@@ -65,7 +65,6 @@ def apply_backward_compatibility_patches():
|
|
|
65
65
|
and hasattr(request, "params")
|
|
66
66
|
and request.params is not None
|
|
67
67
|
):
|
|
68
|
-
|
|
69
68
|
# Convert params to dict to check for clientInfo
|
|
70
69
|
params_dict = request.params
|
|
71
70
|
if hasattr(params_dict, "model_dump"):
|
|
@@ -542,7 +541,6 @@ class SimpleMCPServer:
|
|
|
542
541
|
|
|
543
542
|
result = f"Python: {sys.version}"
|
|
544
543
|
elif info_type == "cwd":
|
|
545
|
-
|
|
546
544
|
result = f"Working Directory: {Path.cwd()}"
|
|
547
545
|
elif info_type == "all":
|
|
548
546
|
import datetime
|
|
@@ -73,7 +73,7 @@ class LRUCache:
|
|
|
73
73
|
if not self.cache:
|
|
74
74
|
break
|
|
75
75
|
# Remove least recently used item
|
|
76
|
-
|
|
76
|
+
_removed_key, removed_value = self.cache.popitem(last=False)
|
|
77
77
|
self.current_memory -= removed_value.get("size_bytes", 0)
|
|
78
78
|
|
|
79
79
|
# Add new item
|
|
@@ -199,7 +199,9 @@ class KuzuMemoryService(BaseToolAdapter):
|
|
|
199
199
|
try:
|
|
200
200
|
if action == "store":
|
|
201
201
|
result = await self.store_memory(
|
|
202
|
-
params.get("content"),
|
|
202
|
+
params.get("content"),
|
|
203
|
+
params.get("tags"),
|
|
204
|
+
{}, # metadata
|
|
203
205
|
)
|
|
204
206
|
elif action == "recall":
|
|
205
207
|
result = await self.recall_memories(
|
|
@@ -213,7 +215,9 @@ class KuzuMemoryService(BaseToolAdapter):
|
|
|
213
215
|
)
|
|
214
216
|
elif action == "context":
|
|
215
217
|
result = await self.get_context(
|
|
216
|
-
params.get("query", ""),
|
|
218
|
+
params.get("query", ""),
|
|
219
|
+
2,
|
|
220
|
+
True, # depth # include_related
|
|
217
221
|
)
|
|
218
222
|
else:
|
|
219
223
|
return MCPToolResult(success=False, error=f"Unknown action: {action}")
|
|
@@ -618,7 +618,7 @@ class MemoryOptimizer(LoggerMixin):
|
|
|
618
618
|
)
|
|
619
619
|
|
|
620
620
|
# Check for similar items
|
|
621
|
-
|
|
621
|
+
_consolidated, consolidated_count = self._consolidate_similar_items(
|
|
622
622
|
unique_points
|
|
623
623
|
)
|
|
624
624
|
if consolidated_count > 0:
|
|
@@ -266,7 +266,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
266
266
|
|
|
267
267
|
# Route based on strategy
|
|
268
268
|
if self.strategy == RoutingStrategy.CLAUDE_ONLY:
|
|
269
|
-
return await self._route_to_claude(content, task, model, **kwargs)
|
|
269
|
+
return await self._route_to_claude(content, task, model=model, **kwargs)
|
|
270
270
|
|
|
271
271
|
if self.strategy in (
|
|
272
272
|
RoutingStrategy.OLLAMA_ONLY,
|
|
@@ -275,13 +275,13 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
275
275
|
return await self._route_to_ollama(
|
|
276
276
|
content,
|
|
277
277
|
task,
|
|
278
|
-
model,
|
|
278
|
+
model=model,
|
|
279
279
|
require_success=True,
|
|
280
280
|
**kwargs,
|
|
281
281
|
)
|
|
282
282
|
|
|
283
283
|
# AUTO strategy
|
|
284
|
-
return await self._route_auto(content, task, model, **kwargs)
|
|
284
|
+
return await self._route_auto(content, task, model=model, **kwargs)
|
|
285
285
|
|
|
286
286
|
async def _route_auto(
|
|
287
287
|
self,
|
|
@@ -308,7 +308,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
308
308
|
response = await self._route_to_ollama(
|
|
309
309
|
content,
|
|
310
310
|
task,
|
|
311
|
-
model,
|
|
311
|
+
model=model,
|
|
312
312
|
require_success=False,
|
|
313
313
|
**kwargs,
|
|
314
314
|
)
|
|
@@ -325,7 +325,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
325
325
|
# Ollama unavailable or failed - fallback to Claude
|
|
326
326
|
if self.fallback_enabled:
|
|
327
327
|
self.log_info("Falling back to Claude")
|
|
328
|
-
return await self._route_to_claude(content, task, model, **kwargs)
|
|
328
|
+
return await self._route_to_claude(content, task, model=model, **kwargs)
|
|
329
329
|
return self._create_error_response(
|
|
330
330
|
task,
|
|
331
331
|
model,
|
|
@@ -356,8 +356,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
356
356
|
if require_success and not await self.ollama_provider.is_available():
|
|
357
357
|
if self.strategy == RoutingStrategy.PRIVACY_FIRST:
|
|
358
358
|
error_msg = (
|
|
359
|
-
"Ollama not available. Privacy mode enabled - "
|
|
360
|
-
"not sending to cloud."
|
|
359
|
+
"Ollama not available. Privacy mode enabled - not sending to cloud."
|
|
361
360
|
)
|
|
362
361
|
else:
|
|
363
362
|
error_msg = "Ollama not available and required by configuration"
|
|
@@ -368,7 +367,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
368
367
|
self._route_count["ollama"] += 1
|
|
369
368
|
|
|
370
369
|
return await self.ollama_provider.analyze_content(
|
|
371
|
-
content, task, model, **kwargs
|
|
370
|
+
content, task, model=model, **kwargs
|
|
372
371
|
)
|
|
373
372
|
|
|
374
373
|
async def _route_to_claude(
|
|
@@ -394,7 +393,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
394
393
|
self._route_count["claude"] += 1
|
|
395
394
|
|
|
396
395
|
return await self.claude_provider.analyze_content(
|
|
397
|
-
content, task, model, **kwargs
|
|
396
|
+
content, task, model=model, **kwargs
|
|
398
397
|
)
|
|
399
398
|
|
|
400
399
|
def _create_error_response(
|
|
@@ -203,8 +203,8 @@ class UnifiedMonitorServer:
|
|
|
203
203
|
# Create Socket.IO server with proper ping configuration
|
|
204
204
|
self.sio = socketio.AsyncServer(
|
|
205
205
|
cors_allowed_origins="*",
|
|
206
|
-
logger=
|
|
207
|
-
engineio_logger=
|
|
206
|
+
logger=True, # Enable to see Socket.IO events and connection lifecycle
|
|
207
|
+
engineio_logger=True, # Enable to see Engine.IO protocol handshake details
|
|
208
208
|
ping_interval=30, # 30 seconds ping interval (matches client expectation)
|
|
209
209
|
ping_timeout=60, # 60 seconds ping timeout (generous for stability)
|
|
210
210
|
)
|