claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__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 +35 -6
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- 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/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/circuit-breakers.md +1254 -0
- 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 +37 -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 +537 -239
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +924 -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/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +67 -1
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +125 -167
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +835 -44
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +1032 -47
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +256 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +53 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- 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 +564 -108
- 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 +17 -2
- claude_mpm/commands/mpm-init.md +28 -3
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -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 +11 -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/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +19 -35
- 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/file_loader.py +54 -101
- 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 +131 -10
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +110 -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/core/unified_config.py +22 -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/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +12 -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/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/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 +504 -0
- claude_mpm/services/cli/session_resume_helper.py +36 -16
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +200 -6
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/core/models/agent_config.py +3 -0
- claude_mpm/services/core/models/process.py +4 -0
- 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/diagnostics/models.py +21 -0
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- 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 +5 -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_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
- 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/external_mcp_services.py +26 -21
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- 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/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/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +165 -7
- 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 +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/__init__.py +3 -3
- claude_mpm/skills/agent_skills_injector.py +42 -49
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
- claude_mpm/skills/skills_registry.py +44 -48
- claude_mpm/skills/skills_service.py +117 -108
- 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/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
- 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/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -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 -281
- 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/cli/commands/mpm_init.py +0 -2093
- 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 -75
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
- claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
- 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 -175
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
- 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 -328
- 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/skill-creator/SKILL.md +0 -209
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
- 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 -304
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- /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.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
claude_mpm/core/interfaces.py
CHANGED
|
@@ -33,7 +33,62 @@ from pathlib import Path
|
|
|
33
33
|
from typing import Any, Dict, Generic, List, Optional, Tuple, TypeVar
|
|
34
34
|
|
|
35
35
|
# Re-export everything from the new location for backward compatibility
|
|
36
|
-
from claude_mpm.services.core.interfaces import
|
|
36
|
+
from claude_mpm.services.core.interfaces import ( # noqa: F401
|
|
37
|
+
AgentCapabilitiesInterface,
|
|
38
|
+
AgentDeploymentInterface,
|
|
39
|
+
AgentMetadata,
|
|
40
|
+
CacheEntry,
|
|
41
|
+
CommandHandlerInterface,
|
|
42
|
+
HealthStatus,
|
|
43
|
+
HookServiceInterface,
|
|
44
|
+
IAgentRecommender,
|
|
45
|
+
IAgentRegistry,
|
|
46
|
+
IAutoConfigManager,
|
|
47
|
+
ICacheService,
|
|
48
|
+
IConfigurationManager,
|
|
49
|
+
IConfigurationService,
|
|
50
|
+
ICrashDetector,
|
|
51
|
+
IDeploymentStateManager,
|
|
52
|
+
IErrorHandler,
|
|
53
|
+
IEventBus,
|
|
54
|
+
IHealthCheck,
|
|
55
|
+
IHealthCheckManager,
|
|
56
|
+
IHealthMonitor,
|
|
57
|
+
ILocalProcessManager,
|
|
58
|
+
ILogMonitor,
|
|
59
|
+
IMemoryLeakDetector,
|
|
60
|
+
IModelProvider,
|
|
61
|
+
IModelRouter,
|
|
62
|
+
InterfaceRegistry,
|
|
63
|
+
IPerformanceMonitor,
|
|
64
|
+
IPromptCache,
|
|
65
|
+
IResourceMonitor,
|
|
66
|
+
IRestartManager,
|
|
67
|
+
IRestartPolicy,
|
|
68
|
+
IServiceContainer,
|
|
69
|
+
IServiceFactory,
|
|
70
|
+
IServiceLifecycle,
|
|
71
|
+
IStructuredLogger,
|
|
72
|
+
ITemplateManager,
|
|
73
|
+
IToolchainAnalyzer,
|
|
74
|
+
MemoryHookInterface,
|
|
75
|
+
MemoryServiceInterface,
|
|
76
|
+
ModelCapability,
|
|
77
|
+
ModelProvider,
|
|
78
|
+
ModelResponse,
|
|
79
|
+
ProjectAnalyzerInterface,
|
|
80
|
+
RunnerConfigurationInterface,
|
|
81
|
+
ServiceType,
|
|
82
|
+
SessionManagementInterface,
|
|
83
|
+
SocketIOServiceInterface,
|
|
84
|
+
SubprocessLauncherInterface,
|
|
85
|
+
SystemInstructionsInterface,
|
|
86
|
+
T,
|
|
87
|
+
TemplateRenderContext,
|
|
88
|
+
TicketManagerInterface,
|
|
89
|
+
UtilityServiceInterface,
|
|
90
|
+
VersionServiceInterface,
|
|
91
|
+
)
|
|
37
92
|
|
|
38
93
|
# Type variables for generic interfaces
|
|
39
94
|
T = TypeVar("T")
|
claude_mpm/core/logger.py
CHANGED
|
@@ -225,7 +225,9 @@ def setup_logging(
|
|
|
225
225
|
|
|
226
226
|
# Use rotating file handler
|
|
227
227
|
file_handler = logging.handlers.RotatingFileHandler(
|
|
228
|
-
log_file,
|
|
228
|
+
log_file,
|
|
229
|
+
maxBytes=10 * 1024 * 1024,
|
|
230
|
+
backupCount=5, # 10 MB
|
|
229
231
|
)
|
|
230
232
|
else:
|
|
231
233
|
# Use default log directory
|
|
@@ -2,19 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
This module encapsulates the logic for running one-time Claude commands,
|
|
4
4
|
breaking down the monolithic run_oneshot method into focused, testable components.
|
|
5
|
+
|
|
6
|
+
DEPENDENCY INJECTION:
|
|
7
|
+
This module uses protocol-based dependency injection to break circular imports.
|
|
8
|
+
Instead of importing ClaudeRunner directly, it uses ClaudeRunnerProtocol which
|
|
9
|
+
defines the interface it needs.
|
|
5
10
|
"""
|
|
6
11
|
|
|
7
12
|
import contextlib
|
|
8
13
|
import os
|
|
9
14
|
import subprocess
|
|
15
|
+
import tempfile
|
|
10
16
|
import time
|
|
11
17
|
import uuid
|
|
12
18
|
from pathlib import Path
|
|
13
|
-
from typing import Any, Dict, Optional, Tuple
|
|
19
|
+
from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple
|
|
14
20
|
|
|
15
21
|
from claude_mpm.core.enums import OperationResult, ServiceState
|
|
16
22
|
from claude_mpm.core.logger import get_logger
|
|
17
23
|
|
|
24
|
+
# Protocol imports for type checking without circular dependencies
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from claude_mpm.core.protocols import ClaudeRunnerProtocol
|
|
27
|
+
else:
|
|
28
|
+
# At runtime, accept any object with matching interface
|
|
29
|
+
ClaudeRunnerProtocol = Any
|
|
30
|
+
|
|
18
31
|
|
|
19
32
|
class OneshotSession:
|
|
20
33
|
"""Manages a single oneshot Claude execution session.
|
|
@@ -26,17 +39,18 @@ class OneshotSession:
|
|
|
26
39
|
complexity < 10 and lines < 80, making the code easier to test and modify.
|
|
27
40
|
"""
|
|
28
41
|
|
|
29
|
-
def __init__(self, runner):
|
|
42
|
+
def __init__(self, runner: "ClaudeRunnerProtocol"):
|
|
30
43
|
"""Initialize the oneshot session with a reference to the runner.
|
|
31
44
|
|
|
32
45
|
Args:
|
|
33
|
-
runner: The ClaudeRunner instance
|
|
46
|
+
runner: The ClaudeRunner instance (or any object matching ClaudeRunnerProtocol)
|
|
34
47
|
"""
|
|
35
|
-
self.runner = runner
|
|
48
|
+
self.runner: ClaudeRunnerProtocol = runner
|
|
36
49
|
self.logger = get_logger("oneshot_session")
|
|
37
50
|
self.start_time = None
|
|
38
51
|
self.session_id = None
|
|
39
52
|
self.original_cwd = None
|
|
53
|
+
self.temp_system_prompt_file = None
|
|
40
54
|
|
|
41
55
|
def initialize_session(self, prompt: str) -> Tuple[bool, Optional[str]]:
|
|
42
56
|
"""Initialize the oneshot session.
|
|
@@ -134,7 +148,13 @@ class OneshotSession:
|
|
|
134
148
|
def _build_final_command(
|
|
135
149
|
self, prompt: str, context: Optional[str], infrastructure: Dict[str, Any]
|
|
136
150
|
) -> list:
|
|
137
|
-
"""Build the final command with prompt and system instructions.
|
|
151
|
+
"""Build the final command with prompt and system instructions.
|
|
152
|
+
|
|
153
|
+
Uses file-based caching to avoid Linux ARG_MAX limits:
|
|
154
|
+
- Linux MAX_ARG_STRLEN: 128 KB per argument
|
|
155
|
+
- System prompt size: ~138.7 KB (exceeds limit by 7.7 KB)
|
|
156
|
+
- Solution: Write to temp file, pass file path (~60 bytes)
|
|
157
|
+
"""
|
|
138
158
|
full_prompt = f"{context}\n\n{prompt}" if context else prompt
|
|
139
159
|
cmd = infrastructure["cmd"] + ["--print", full_prompt]
|
|
140
160
|
|
|
@@ -148,9 +168,38 @@ class OneshotSession:
|
|
|
148
168
|
self.logger.warning("System prompt contains Python code references!")
|
|
149
169
|
|
|
150
170
|
if system_prompt and system_prompt != self._get_simple_context():
|
|
151
|
-
#
|
|
152
|
-
#
|
|
153
|
-
|
|
171
|
+
# Use file-based loading to avoid ARG_MAX limits (1M-485)
|
|
172
|
+
# Create temp file for system prompt
|
|
173
|
+
try:
|
|
174
|
+
# Create temp file in system temp directory
|
|
175
|
+
temp_fd, temp_path = tempfile.mkstemp(
|
|
176
|
+
suffix=".md", prefix="claude_mpm_system_prompt_"
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# Write system prompt to temp file
|
|
180
|
+
with os.fdopen(temp_fd, "w", encoding="utf-8") as f:
|
|
181
|
+
f.write(system_prompt)
|
|
182
|
+
|
|
183
|
+
# Store temp file path for cleanup
|
|
184
|
+
self.temp_system_prompt_file = temp_path
|
|
185
|
+
|
|
186
|
+
# Use --system-prompt-file flag (matches interactive mode pattern)
|
|
187
|
+
cmd.extend(["--system-prompt-file", temp_path])
|
|
188
|
+
|
|
189
|
+
# User-visible notification
|
|
190
|
+
print(f"📄 Reading system prompt from: {temp_path}")
|
|
191
|
+
|
|
192
|
+
self.logger.info(
|
|
193
|
+
f"Using file-based system prompt loading: {temp_path} "
|
|
194
|
+
f"({len(system_prompt) / 1024:.1f} KB)"
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
except Exception as e:
|
|
198
|
+
# Fallback to inline if file creation fails
|
|
199
|
+
self.logger.warning(
|
|
200
|
+
f"Failed to create temp file for system prompt, using inline: {e}"
|
|
201
|
+
)
|
|
202
|
+
cmd.extend(["--append-system-prompt", system_prompt])
|
|
154
203
|
|
|
155
204
|
return cmd
|
|
156
205
|
|
|
@@ -203,6 +252,20 @@ class OneshotSession:
|
|
|
203
252
|
|
|
204
253
|
def cleanup_session(self) -> None:
|
|
205
254
|
"""Clean up the session and restore state."""
|
|
255
|
+
# Clean up temp system prompt file
|
|
256
|
+
if self.temp_system_prompt_file:
|
|
257
|
+
try:
|
|
258
|
+
temp_file_path = Path(self.temp_system_prompt_file)
|
|
259
|
+
if temp_file_path.exists():
|
|
260
|
+
temp_file_path.unlink()
|
|
261
|
+
self.logger.debug(
|
|
262
|
+
f"Cleaned up temp system prompt file: {self.temp_system_prompt_file}"
|
|
263
|
+
)
|
|
264
|
+
except Exception as e:
|
|
265
|
+
self.logger.warning(f"Failed to clean up temp system prompt file: {e}")
|
|
266
|
+
finally:
|
|
267
|
+
self.temp_system_prompt_file = None
|
|
268
|
+
|
|
206
269
|
# Restore original working directory
|
|
207
270
|
if self.original_cwd:
|
|
208
271
|
with contextlib.suppress(Exception):
|
|
@@ -268,8 +331,47 @@ class OneshotSession:
|
|
|
268
331
|
if self.runner.claude_args:
|
|
269
332
|
cmd.extend(self.runner.claude_args)
|
|
270
333
|
|
|
334
|
+
# Add --agents flag if native agents mode is enabled
|
|
335
|
+
if getattr(self.runner, "use_native_agents", False):
|
|
336
|
+
agents_flag = self._build_agents_flag()
|
|
337
|
+
if agents_flag:
|
|
338
|
+
cmd.extend(agents_flag)
|
|
339
|
+
self.logger.info("✓ Native agents mode: Using --agents CLI flag")
|
|
340
|
+
|
|
271
341
|
return cmd
|
|
272
342
|
|
|
343
|
+
def _build_agents_flag(self) -> Optional[list]:
|
|
344
|
+
"""Build --agents flag with all MPM agents.
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
List with ["--agents", "<json>"] or None if conversion fails
|
|
348
|
+
"""
|
|
349
|
+
try:
|
|
350
|
+
from claude_mpm.services.native_agent_converter import NativeAgentConverter
|
|
351
|
+
|
|
352
|
+
converter = NativeAgentConverter()
|
|
353
|
+
agents = converter.load_agents_from_templates()
|
|
354
|
+
|
|
355
|
+
if not agents:
|
|
356
|
+
self.logger.warning("No agents loaded for native mode")
|
|
357
|
+
return None
|
|
358
|
+
|
|
359
|
+
# Generate JSON for --agents flag
|
|
360
|
+
agents_json = converter.generate_agents_json(agents)
|
|
361
|
+
summary = converter.get_conversion_summary(agents)
|
|
362
|
+
|
|
363
|
+
self.logger.info(
|
|
364
|
+
f"Native agents: {summary['total_agents']} agents, "
|
|
365
|
+
f"{summary['json_size_kb']} KB JSON"
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
# Return as list: ["--agents", "<json>"]
|
|
369
|
+
return ["--agents", agents_json]
|
|
370
|
+
|
|
371
|
+
except Exception as e:
|
|
372
|
+
self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
|
|
373
|
+
return None
|
|
374
|
+
|
|
273
375
|
def _handle_successful_response(self, response: str, prompt: str) -> None:
|
|
274
376
|
"""Process a successful Claude response."""
|
|
275
377
|
print(response)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Protocol interfaces for dependency injection.
|
|
2
|
+
|
|
3
|
+
This module defines Protocol interfaces to break circular dependencies
|
|
4
|
+
using Python's typing.Protocol feature for structural subtyping.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from claude_mpm.core.protocols.runner_protocol import (
|
|
8
|
+
ClaudeRunnerProtocol,
|
|
9
|
+
SystemPromptProvider,
|
|
10
|
+
)
|
|
11
|
+
from claude_mpm.core.protocols.session_protocol import (
|
|
12
|
+
InteractiveSessionProtocol,
|
|
13
|
+
OneshotSessionProtocol,
|
|
14
|
+
SessionManagementProtocol,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"ClaudeRunnerProtocol",
|
|
19
|
+
"InteractiveSessionProtocol",
|
|
20
|
+
"OneshotSessionProtocol",
|
|
21
|
+
"SessionManagementProtocol",
|
|
22
|
+
"SystemPromptProvider",
|
|
23
|
+
]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Protocol definitions for ClaudeRunner dependencies.
|
|
2
|
+
|
|
3
|
+
These protocols use Python's typing.Protocol for structural subtyping,
|
|
4
|
+
allowing dependency injection without circular imports.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any, Optional, Protocol
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SystemPromptProvider(Protocol):
|
|
12
|
+
"""Protocol for providing system prompts without circular dependency.
|
|
13
|
+
|
|
14
|
+
This protocol allows InteractiveSession to get system prompts without
|
|
15
|
+
directly importing ClaudeRunner, breaking the circular dependency.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def _create_system_prompt(self) -> str:
|
|
19
|
+
"""Create the complete system prompt including instructions.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
Complete system prompt as string
|
|
23
|
+
"""
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ClaudeRunnerProtocol(Protocol):
|
|
28
|
+
"""Protocol defining the interface InteractiveSession needs from ClaudeRunner.
|
|
29
|
+
|
|
30
|
+
This protocol breaks the circular dependency between InteractiveSession
|
|
31
|
+
and ClaudeRunner by defining only the methods that InteractiveSession
|
|
32
|
+
actually uses, without requiring the full ClaudeRunner import.
|
|
33
|
+
|
|
34
|
+
Design Decision: Uses Protocol instead of ABC to allow structural subtyping.
|
|
35
|
+
This means ClaudeRunner doesn't need to explicitly inherit from this protocol,
|
|
36
|
+
it just needs to implement these methods with matching signatures.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
# Configuration attributes
|
|
40
|
+
enable_websocket: bool
|
|
41
|
+
enable_tickets: bool
|
|
42
|
+
log_level: str
|
|
43
|
+
claude_args: Optional[list]
|
|
44
|
+
launch_method: str
|
|
45
|
+
websocket_port: int
|
|
46
|
+
use_native_agents: bool
|
|
47
|
+
config: Any
|
|
48
|
+
session_log_file: Optional[Path]
|
|
49
|
+
|
|
50
|
+
# Service references
|
|
51
|
+
project_logger: Any
|
|
52
|
+
websocket_server: Any
|
|
53
|
+
command_handler_service: Any
|
|
54
|
+
subprocess_launcher_service: Any
|
|
55
|
+
|
|
56
|
+
def setup_agents(self) -> bool:
|
|
57
|
+
"""Deploy native agents to .claude/agents/.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
True if successful, False otherwise
|
|
61
|
+
"""
|
|
62
|
+
...
|
|
63
|
+
|
|
64
|
+
def deploy_project_agents_to_claude(self) -> bool:
|
|
65
|
+
"""Deploy project agents from .claude-mpm/agents/ to .claude/agents/.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
True if successful, False otherwise
|
|
69
|
+
"""
|
|
70
|
+
...
|
|
71
|
+
|
|
72
|
+
def _create_system_prompt(self) -> str:
|
|
73
|
+
"""Create the complete system prompt including instructions.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Complete system prompt as string
|
|
77
|
+
"""
|
|
78
|
+
...
|
|
79
|
+
|
|
80
|
+
def _get_version(self) -> str:
|
|
81
|
+
"""Get version string.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
Version string
|
|
85
|
+
"""
|
|
86
|
+
...
|
|
87
|
+
|
|
88
|
+
def _log_session_event(self, event_data: dict) -> None:
|
|
89
|
+
"""Log an event to the session log file.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
event_data: Event data to log
|
|
93
|
+
"""
|
|
94
|
+
...
|
|
95
|
+
|
|
96
|
+
def _launch_subprocess_interactive(self, cmd: list, env: dict) -> None:
|
|
97
|
+
"""Launch Claude as a subprocess with PTY for interactive mode.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
cmd: Command to execute
|
|
101
|
+
env: Environment variables
|
|
102
|
+
"""
|
|
103
|
+
...
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""Protocol definitions for session management dependencies.
|
|
2
|
+
|
|
3
|
+
These protocols use Python's typing.Protocol for structural subtyping,
|
|
4
|
+
allowing dependency injection without circular imports.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, Dict, Optional, Protocol, Tuple
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class InteractiveSessionProtocol(Protocol):
|
|
11
|
+
"""Protocol for interactive session orchestration.
|
|
12
|
+
|
|
13
|
+
This protocol defines the interface that SessionManagementService
|
|
14
|
+
needs from InteractiveSession without requiring a full import.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def initialize_interactive_session(self) -> Tuple[bool, Optional[str]]:
|
|
18
|
+
"""Initialize the interactive session environment.
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
Tuple of (success, error_message)
|
|
22
|
+
"""
|
|
23
|
+
...
|
|
24
|
+
|
|
25
|
+
def setup_interactive_environment(self) -> Tuple[bool, Dict[str, Any]]:
|
|
26
|
+
"""Set up the interactive environment including agents and commands.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
Tuple of (success, environment_dict)
|
|
30
|
+
"""
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
def handle_interactive_input(self, environment: Dict[str, Any]) -> bool:
|
|
34
|
+
"""Handle the interactive input/output loop.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
environment: Dictionary with command, env vars, and session info
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
True if successful, False otherwise
|
|
41
|
+
"""
|
|
42
|
+
...
|
|
43
|
+
|
|
44
|
+
def cleanup_interactive_session(self) -> None:
|
|
45
|
+
"""Clean up resources after interactive session ends."""
|
|
46
|
+
...
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class OneshotSessionProtocol(Protocol):
|
|
50
|
+
"""Protocol for oneshot session orchestration.
|
|
51
|
+
|
|
52
|
+
This protocol defines the interface that SessionManagementService
|
|
53
|
+
needs from OneshotSession without requiring a full import.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def initialize_session(self, prompt: str) -> Tuple[bool, Optional[str]]:
|
|
57
|
+
"""Initialize the oneshot session.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
prompt: The command or prompt to execute
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Tuple of (success, error_message)
|
|
64
|
+
"""
|
|
65
|
+
...
|
|
66
|
+
|
|
67
|
+
def deploy_agents(self) -> bool:
|
|
68
|
+
"""Deploy agents for the session.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
True if successful, False otherwise
|
|
72
|
+
"""
|
|
73
|
+
...
|
|
74
|
+
|
|
75
|
+
def setup_infrastructure(self) -> Dict[str, Any]:
|
|
76
|
+
"""Set up session infrastructure.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
Dictionary with infrastructure configuration
|
|
80
|
+
"""
|
|
81
|
+
...
|
|
82
|
+
|
|
83
|
+
def execute_command(
|
|
84
|
+
self, prompt: str, context: Optional[str], infrastructure: Dict[str, Any]
|
|
85
|
+
) -> Tuple[bool, Optional[str]]:
|
|
86
|
+
"""Execute the command with given context and infrastructure.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
prompt: Command to execute
|
|
90
|
+
context: Optional context
|
|
91
|
+
infrastructure: Infrastructure configuration
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Tuple of (success, response)
|
|
95
|
+
"""
|
|
96
|
+
...
|
|
97
|
+
|
|
98
|
+
def cleanup_session(self) -> None:
|
|
99
|
+
"""Clean up session resources."""
|
|
100
|
+
...
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class SessionManagementProtocol(Protocol):
|
|
104
|
+
"""Protocol for session management service.
|
|
105
|
+
|
|
106
|
+
This protocol defines the interface that ClaudeRunner needs from
|
|
107
|
+
SessionManagementService without requiring a full import.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
def run_interactive_session(self, initial_context: Optional[str] = None) -> bool:
|
|
111
|
+
"""Run Claude in interactive mode.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
initial_context: Optional initial context to pass to Claude
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
True if successful, False otherwise
|
|
118
|
+
"""
|
|
119
|
+
...
|
|
120
|
+
|
|
121
|
+
def run_oneshot_session(self, prompt: str, context: Optional[str] = None) -> bool:
|
|
122
|
+
"""Run Claude with a single prompt.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
prompt: The command or prompt to execute
|
|
126
|
+
context: Optional context to prepend to the prompt
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
True if successful, False otherwise
|
|
130
|
+
"""
|
|
131
|
+
...
|
|
@@ -16,11 +16,14 @@ class SingletonManager:
|
|
|
16
16
|
|
|
17
17
|
Reduces duplication by providing thread-safe singleton patterns
|
|
18
18
|
that can be used across different classes.
|
|
19
|
+
|
|
20
|
+
Uses RLock (reentrant locks) to support recursive calls from
|
|
21
|
+
SingletonMixin.__new__ and @singleton decorator patterns.
|
|
19
22
|
"""
|
|
20
23
|
|
|
21
24
|
_instances: Dict[Type, Any] = {}
|
|
22
|
-
_locks: Dict[Type, threading.
|
|
23
|
-
_global_lock = threading.
|
|
25
|
+
_locks: Dict[Type, threading.RLock] = {}
|
|
26
|
+
_global_lock = threading.RLock()
|
|
24
27
|
|
|
25
28
|
@classmethod
|
|
26
29
|
def get_instance(
|
|
@@ -42,7 +45,7 @@ class SingletonManager:
|
|
|
42
45
|
if singleton_class not in cls._locks:
|
|
43
46
|
with cls._global_lock:
|
|
44
47
|
if singleton_class not in cls._locks:
|
|
45
|
-
cls._locks[singleton_class] = threading.
|
|
48
|
+
cls._locks[singleton_class] = threading.RLock()
|
|
46
49
|
|
|
47
50
|
# Get instance with class-specific lock
|
|
48
51
|
with cls._locks[singleton_class]:
|
|
@@ -50,9 +53,13 @@ class SingletonManager:
|
|
|
50
53
|
logger = get_logger("singleton_manager")
|
|
51
54
|
logger.debug(f"Creating singleton instance: {singleton_class.__name__}")
|
|
52
55
|
|
|
53
|
-
|
|
56
|
+
# Use object.__new__ to bypass SingletonMixin.__new__ and avoid recursion
|
|
57
|
+
instance = object.__new__(singleton_class)
|
|
54
58
|
cls._instances[singleton_class] = instance
|
|
55
59
|
|
|
60
|
+
# Now call __init__ explicitly with the stored instance
|
|
61
|
+
instance.__init__(*args, **kwargs)
|
|
62
|
+
|
|
56
63
|
return instance
|
|
57
64
|
|
|
58
65
|
return cls._instances[singleton_class]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""System context utilities for Claude runner.
|
|
2
|
+
|
|
3
|
+
This module provides shared context creation functions that can be used
|
|
4
|
+
across different modules without circular dependencies.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def create_simple_context() -> str:
|
|
9
|
+
"""Create basic context for Claude.
|
|
10
|
+
|
|
11
|
+
This function is extracted to avoid circular imports between
|
|
12
|
+
claude_runner.py and interactive_session.py.
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
Basic system context string for Claude
|
|
16
|
+
"""
|
|
17
|
+
return """You are Claude Code running in Claude MPM (Multi-Agent Project Manager).
|
|
18
|
+
|
|
19
|
+
You have access to native subagents via the Task tool with subagent_type parameter:
|
|
20
|
+
- engineer: For coding, implementation, and technical tasks
|
|
21
|
+
- qa: For testing, validation, and quality assurance
|
|
22
|
+
- documentation: For docs, guides, and explanations
|
|
23
|
+
- research: For investigation and analysis
|
|
24
|
+
- security: For security-related tasks
|
|
25
|
+
- ops: For deployment and infrastructure
|
|
26
|
+
- version-control: For git and version management
|
|
27
|
+
- data-engineer: For data processing and APIs
|
|
28
|
+
|
|
29
|
+
Use these agents by calling: Task(description="task description", subagent_type="agent_name")
|
|
30
|
+
|
|
31
|
+
IMPORTANT: The Task tool accepts both naming formats:
|
|
32
|
+
- Capitalized format: "Research", "Engineer", "QA", "Version Control", "Data Engineer"
|
|
33
|
+
- Lowercase format: "research", "engineer", "qa", "version-control", "data-engineer"
|
|
34
|
+
|
|
35
|
+
Both formats work correctly. When you see capitalized names (matching TodoWrite prefixes),
|
|
36
|
+
automatically normalize them to lowercase-hyphenated format for the Task tool.
|
|
37
|
+
|
|
38
|
+
Work efficiently and delegate appropriately to subagents when needed."""
|
|
@@ -218,6 +218,27 @@ class DevelopmentConfig(BaseModel):
|
|
|
218
218
|
)
|
|
219
219
|
|
|
220
220
|
|
|
221
|
+
class DocumentationConfig(BaseModel):
|
|
222
|
+
"""Documentation routing and management configuration."""
|
|
223
|
+
|
|
224
|
+
docs_path: str = Field(
|
|
225
|
+
default="docs/research/",
|
|
226
|
+
description="Default path for session documentation (relative to project root)",
|
|
227
|
+
)
|
|
228
|
+
attach_to_tickets: bool = Field(
|
|
229
|
+
default=True,
|
|
230
|
+
description="Attach work products to tickets when ticket context exists",
|
|
231
|
+
)
|
|
232
|
+
backup_locally: bool = Field(
|
|
233
|
+
default=True,
|
|
234
|
+
description="Always create local backup copies of documentation",
|
|
235
|
+
)
|
|
236
|
+
enable_ticket_detection: bool = Field(
|
|
237
|
+
default=True,
|
|
238
|
+
description="Enable automatic ticket context detection from user messages",
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
|
|
221
242
|
class UnifiedConfig(BaseSettings):
|
|
222
243
|
"""
|
|
223
244
|
Unified configuration model for Claude MPM.
|
|
@@ -242,6 +263,7 @@ class UnifiedConfig(BaseSettings):
|
|
|
242
263
|
performance: PerformanceConfig = Field(default_factory=PerformanceConfig)
|
|
243
264
|
sessions: SessionConfig = Field(default_factory=SessionConfig)
|
|
244
265
|
development: DevelopmentConfig = Field(default_factory=DevelopmentConfig)
|
|
266
|
+
documentation: DocumentationConfig = Field(default_factory=DocumentationConfig)
|
|
245
267
|
|
|
246
268
|
# Path configuration
|
|
247
269
|
base_path: Optional[Path] = Field(
|