claude-mpm 4.24.0__py3-none-any.whl → 5.0.9__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/agents/BASE_PM.md +12 -0
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +721 -911
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +4 -4
- 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/base_agent_loader.py +10 -35
- 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} +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 +38 -2
- 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 +188 -30
- claude_mpm/cli/commands/agents.py +959 -36
- 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/config.py +7 -4
- claude_mpm/cli/commands/configure.py +769 -45
- 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 +49 -1
- 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/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +757 -20
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +955 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +256 -4
- claude_mpm/cli/parsers/base_parser.py +53 -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 +145 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +538 -106
- 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 +14 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -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 +488 -0
- claude_mpm/config/agent_sources.py +325 -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 +16 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- 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 +3 -1
- claude_mpm/core/oneshot_session.py +71 -8
- 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/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- 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/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -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/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/cache_git_manager.py +621 -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 +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -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 +200 -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 +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/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/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 +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/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_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- 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/kuzu_memory_service.py +6 -2
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +29 -9
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- claude_mpm/services/monitor/server.py +2 -2
- 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 +16 -3
- claude_mpm/services/session_management_service.py +16 -4
- 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 +1 -1
- 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/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/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/utils/agent_dependency_loader.py +77 -10
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +2 -4
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
- 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/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/commands/mpm-tickets.md +0 -151
- 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.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.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,
|
|
@@ -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)"
|