claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -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):
|
|
@@ -165,6 +165,9 @@ class OptimizedStartup:
|
|
|
165
165
|
# Just setup agent registry, load on demand
|
|
166
166
|
self._setup_agent_registry()
|
|
167
167
|
|
|
168
|
+
# Verify PM skills after agent setup (non-blocking)
|
|
169
|
+
self._verify_pm_skills()
|
|
170
|
+
|
|
168
171
|
elapsed = time.time() - phase_start
|
|
169
172
|
self.metrics.phases["agents"] = elapsed
|
|
170
173
|
self.metrics.agent_time = elapsed
|
|
@@ -198,6 +201,62 @@ class OptimizedStartup:
|
|
|
198
201
|
|
|
199
202
|
return self.metrics
|
|
200
203
|
|
|
204
|
+
def _verify_pm_skills(self) -> None:
|
|
205
|
+
"""Verify PM skills are deployed. Non-blocking with warnings."""
|
|
206
|
+
try:
|
|
207
|
+
from claude_mpm.services.pm_skills_deployer import PMSkillsDeployerService
|
|
208
|
+
|
|
209
|
+
deployer = PMSkillsDeployerService()
|
|
210
|
+
project_dir = Path.cwd()
|
|
211
|
+
|
|
212
|
+
result = deployer.verify_pm_skills(project_dir)
|
|
213
|
+
|
|
214
|
+
if not result.verified:
|
|
215
|
+
for warning in result.warnings:
|
|
216
|
+
self.logger.warning(warning)
|
|
217
|
+
|
|
218
|
+
# Check if auto-deploy is enabled
|
|
219
|
+
if self._should_auto_deploy_pm_skills():
|
|
220
|
+
self.logger.info("Auto-deploying PM skills...")
|
|
221
|
+
deploy_result = deployer.deploy_pm_skills(project_dir)
|
|
222
|
+
if deploy_result.success:
|
|
223
|
+
self.logger.info(
|
|
224
|
+
f"PM skills deployed: {len(deploy_result.deployed)} deployed, "
|
|
225
|
+
f"{len(deploy_result.skipped)} skipped"
|
|
226
|
+
)
|
|
227
|
+
else:
|
|
228
|
+
self.logger.warning(
|
|
229
|
+
f"PM skills deployment had errors: {len(deploy_result.errors)}"
|
|
230
|
+
)
|
|
231
|
+
else:
|
|
232
|
+
# Count skills from registry
|
|
233
|
+
registry = deployer._load_registry(project_dir)
|
|
234
|
+
skill_count = len(registry.get("skills", []))
|
|
235
|
+
self.logger.debug(f"PM skills verified: {skill_count} skills")
|
|
236
|
+
|
|
237
|
+
except ImportError:
|
|
238
|
+
self.logger.debug("PM skills deployer not available")
|
|
239
|
+
except Exception as e:
|
|
240
|
+
self.logger.warning(f"PM skills verification failed: {e}")
|
|
241
|
+
|
|
242
|
+
def _should_auto_deploy_pm_skills(self) -> bool:
|
|
243
|
+
"""Check if auto-deploy is enabled via config.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
True if auto-deploy should be performed (default: True for convenience)
|
|
247
|
+
"""
|
|
248
|
+
# Default to True for convenience - PM skills are essential for PM agents
|
|
249
|
+
# Users can disable by setting environment variable or config
|
|
250
|
+
import os
|
|
251
|
+
|
|
252
|
+
# Check environment variable override
|
|
253
|
+
env_disable = os.environ.get("CLAUDE_MPM_DISABLE_AUTO_DEPLOY_PM_SKILLS", "").lower()
|
|
254
|
+
if env_disable in ("1", "true", "yes"):
|
|
255
|
+
return False
|
|
256
|
+
|
|
257
|
+
# Default to enabled
|
|
258
|
+
return True
|
|
259
|
+
|
|
201
260
|
def _setup_logging(self):
|
|
202
261
|
"""Setup basic logging (critical path)."""
|
|
203
262
|
# Minimal logging setup - already handled by logger module
|
|
@@ -5,6 +5,7 @@ This module handles:
|
|
|
5
5
|
2. Output style extraction from framework instructions
|
|
6
6
|
3. One-time deployment to Claude Code >= 1.0.83 at startup
|
|
7
7
|
4. Fallback injection for older versions
|
|
8
|
+
5. Support for multiple output styles (professional and teaching modes)
|
|
8
9
|
|
|
9
10
|
The output style is set once at startup and not monitored or enforced after that.
|
|
10
11
|
Users can change it if they want, and the system will respect their choice.
|
|
@@ -14,7 +15,7 @@ import json
|
|
|
14
15
|
import re
|
|
15
16
|
import subprocess
|
|
16
17
|
from pathlib import Path
|
|
17
|
-
from typing import Dict, Optional
|
|
18
|
+
from typing import Any, Dict, Literal, Optional, TypedDict, cast
|
|
18
19
|
|
|
19
20
|
from ..utils.imports import safe_import
|
|
20
21
|
|
|
@@ -25,22 +26,56 @@ get_logger = safe_import("claude_mpm.core.logger", "core.logger", ["get_logger"]
|
|
|
25
26
|
_CACHED_CLAUDE_VERSION: Optional[str] = None
|
|
26
27
|
_VERSION_DETECTED: bool = False
|
|
27
28
|
|
|
29
|
+
# Output style types
|
|
30
|
+
OutputStyleType = Literal["professional", "teaching"]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class StyleConfig(TypedDict):
|
|
34
|
+
"""Configuration for an output style."""
|
|
35
|
+
|
|
36
|
+
source: Path
|
|
37
|
+
target: Path
|
|
38
|
+
name: str
|
|
39
|
+
|
|
28
40
|
|
|
29
41
|
class OutputStyleManager:
|
|
30
|
-
"""Manages output style deployment and version-based handling.
|
|
42
|
+
"""Manages output style deployment and version-based handling.
|
|
43
|
+
|
|
44
|
+
Supports two output styles:
|
|
45
|
+
- professional: Default Claude MPM style (claude-mpm.md)
|
|
46
|
+
- teaching: Adaptive teaching mode (claude-mpm-teach.md)
|
|
47
|
+
"""
|
|
31
48
|
|
|
32
|
-
def __init__(self):
|
|
49
|
+
def __init__(self) -> None:
|
|
33
50
|
"""Initialize the output style manager."""
|
|
34
|
-
self.logger = get_logger("output_style_manager")
|
|
51
|
+
self.logger = get_logger("output_style_manager") # type: ignore[misc]
|
|
35
52
|
self.claude_version = self._detect_claude_version()
|
|
36
|
-
|
|
37
|
-
|
|
53
|
+
|
|
54
|
+
# Deploy to ~/.claude/styles/ directory (NOT output-styles/)
|
|
55
|
+
self.output_style_dir = Path.home() / ".claude" / "styles"
|
|
38
56
|
self.settings_file = Path.home() / ".claude" / "settings.json"
|
|
39
57
|
|
|
40
|
-
#
|
|
41
|
-
self.
|
|
42
|
-
|
|
43
|
-
|
|
58
|
+
# Style definitions
|
|
59
|
+
self.styles: Dict[str, StyleConfig] = {
|
|
60
|
+
"professional": StyleConfig(
|
|
61
|
+
source=Path(__file__).parent.parent
|
|
62
|
+
/ "agents"
|
|
63
|
+
/ "CLAUDE_MPM_OUTPUT_STYLE.md",
|
|
64
|
+
target=self.output_style_dir / "claude-mpm.md",
|
|
65
|
+
name="claude-mpm",
|
|
66
|
+
),
|
|
67
|
+
"teaching": StyleConfig(
|
|
68
|
+
source=Path(__file__).parent.parent
|
|
69
|
+
/ "agents"
|
|
70
|
+
/ "CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md",
|
|
71
|
+
target=self.output_style_dir / "claude-mpm-teach.md",
|
|
72
|
+
name="claude-mpm-teach",
|
|
73
|
+
),
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Default style path (for backward compatibility)
|
|
77
|
+
self.output_style_path = self.styles["professional"]["target"]
|
|
78
|
+
self.mpm_output_style_path = self.styles["professional"]["source"]
|
|
44
79
|
|
|
45
80
|
def _detect_claude_version(self) -> Optional[str]:
|
|
46
81
|
"""
|
|
@@ -158,56 +193,77 @@ class OutputStyleManager:
|
|
|
158
193
|
"""
|
|
159
194
|
return not self.supports_output_styles()
|
|
160
195
|
|
|
161
|
-
def extract_output_style_content(
|
|
196
|
+
def extract_output_style_content(
|
|
197
|
+
self, framework_loader: Any = None, style: OutputStyleType = "professional"
|
|
198
|
+
) -> str:
|
|
162
199
|
"""
|
|
163
|
-
Read output style content from
|
|
200
|
+
Read output style content from style source file.
|
|
164
201
|
|
|
165
202
|
Args:
|
|
166
203
|
framework_loader: Optional framework loader (kept for compatibility, not used)
|
|
204
|
+
style: Style type to extract ("professional" or "teaching")
|
|
167
205
|
|
|
168
206
|
Returns:
|
|
169
207
|
Complete output style content from file
|
|
170
208
|
"""
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
209
|
+
style_config = self.styles[style]
|
|
210
|
+
source_path = style_config["source"]
|
|
211
|
+
|
|
212
|
+
if source_path.exists():
|
|
213
|
+
content = source_path.read_text()
|
|
214
|
+
self.logger.info(
|
|
215
|
+
f"Read {style} style from {source_path.name} ({len(content)} chars)"
|
|
216
|
+
)
|
|
175
217
|
return content
|
|
218
|
+
|
|
176
219
|
# Fallback error
|
|
177
|
-
error_msg = f"
|
|
220
|
+
error_msg = f"{style} style not found at {source_path}"
|
|
178
221
|
self.logger.error(error_msg)
|
|
179
222
|
raise FileNotFoundError(error_msg)
|
|
180
223
|
|
|
181
|
-
def save_output_style(
|
|
224
|
+
def save_output_style(
|
|
225
|
+
self, content: str, style: OutputStyleType = "professional"
|
|
226
|
+
) -> Path:
|
|
182
227
|
"""
|
|
183
|
-
Save output style content to
|
|
228
|
+
Save output style content to source file.
|
|
184
229
|
|
|
185
230
|
Args:
|
|
186
231
|
content: The formatted output style content
|
|
232
|
+
style: Style type to save ("professional" or "teaching")
|
|
187
233
|
|
|
188
234
|
Returns:
|
|
189
235
|
Path to the saved file
|
|
190
236
|
"""
|
|
191
237
|
try:
|
|
238
|
+
style_config = self.styles[style]
|
|
239
|
+
source_path = style_config["source"]
|
|
240
|
+
|
|
192
241
|
# Ensure the parent directory exists
|
|
193
|
-
|
|
242
|
+
source_path.parent.mkdir(parents=True, exist_ok=True)
|
|
194
243
|
|
|
195
244
|
# Write the content
|
|
196
|
-
|
|
197
|
-
self.logger.info(f"Saved
|
|
245
|
+
source_path.write_text(content, encoding="utf-8")
|
|
246
|
+
self.logger.info(f"Saved {style} style to {source_path}")
|
|
198
247
|
|
|
199
|
-
return
|
|
248
|
+
return source_path
|
|
200
249
|
except Exception as e:
|
|
201
|
-
self.logger.error(f"Failed to save
|
|
250
|
+
self.logger.error(f"Failed to save {style} style: {e}")
|
|
202
251
|
raise
|
|
203
252
|
|
|
204
|
-
def deploy_output_style(
|
|
253
|
+
def deploy_output_style(
|
|
254
|
+
self,
|
|
255
|
+
content: Optional[str] = None,
|
|
256
|
+
style: OutputStyleType = "professional",
|
|
257
|
+
activate: bool = True,
|
|
258
|
+
) -> bool:
|
|
205
259
|
"""
|
|
206
260
|
Deploy output style to Claude Code if version >= 1.0.83.
|
|
207
|
-
Deploys the style file and activates it
|
|
261
|
+
Deploys the style file and optionally activates it.
|
|
208
262
|
|
|
209
263
|
Args:
|
|
210
|
-
content: The output style content to deploy
|
|
264
|
+
content: The output style content to deploy (if None, reads from source)
|
|
265
|
+
style: Style type to deploy ("professional" or "teaching")
|
|
266
|
+
activate: Whether to activate the style after deployment
|
|
211
267
|
|
|
212
268
|
Returns:
|
|
213
269
|
True if deployed successfully, False otherwise
|
|
@@ -219,26 +275,37 @@ class OutputStyleManager:
|
|
|
219
275
|
return False
|
|
220
276
|
|
|
221
277
|
try:
|
|
222
|
-
|
|
278
|
+
style_config = self.styles[style]
|
|
279
|
+
target_path = style_config["target"]
|
|
280
|
+
style_name = style_config["name"]
|
|
281
|
+
|
|
282
|
+
# If content not provided, read from source
|
|
283
|
+
if content is None:
|
|
284
|
+
content = self.extract_output_style_content(style=style)
|
|
285
|
+
|
|
286
|
+
# Ensure styles directory exists
|
|
223
287
|
self.output_style_dir.mkdir(parents=True, exist_ok=True)
|
|
224
288
|
|
|
225
289
|
# Write the output style file
|
|
226
|
-
|
|
227
|
-
self.logger.info(f"Deployed
|
|
290
|
+
target_path.write_text(content, encoding="utf-8")
|
|
291
|
+
self.logger.info(f"Deployed {style} style to {target_path}")
|
|
228
292
|
|
|
229
|
-
# Activate the
|
|
230
|
-
|
|
293
|
+
# Activate the style if requested
|
|
294
|
+
if activate:
|
|
295
|
+
self._activate_output_style(style_name)
|
|
231
296
|
|
|
232
297
|
return True
|
|
233
298
|
|
|
234
299
|
except Exception as e:
|
|
235
|
-
self.logger.error(f"Failed to deploy
|
|
300
|
+
self.logger.error(f"Failed to deploy {style} style: {e}")
|
|
236
301
|
return False
|
|
237
302
|
|
|
238
|
-
def _activate_output_style(self) -> bool:
|
|
303
|
+
def _activate_output_style(self, style_name: str = "claude-mpm") -> bool:
|
|
239
304
|
"""
|
|
240
|
-
Update Claude Code settings to activate
|
|
241
|
-
|
|
305
|
+
Update Claude Code settings to activate a specific output style.
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
style_name: Name of the style to activate (e.g., "claude-mpm", "claude-mpm-teach")
|
|
242
309
|
|
|
243
310
|
Returns:
|
|
244
311
|
True if activated successfully, False otherwise
|
|
@@ -257,9 +324,9 @@ class OutputStyleManager:
|
|
|
257
324
|
# Check current active style
|
|
258
325
|
current_style = settings.get("activeOutputStyle")
|
|
259
326
|
|
|
260
|
-
# Update active output style
|
|
261
|
-
if current_style !=
|
|
262
|
-
settings["activeOutputStyle"] =
|
|
327
|
+
# Update active output style if different
|
|
328
|
+
if current_style != style_name:
|
|
329
|
+
settings["activeOutputStyle"] = style_name
|
|
263
330
|
|
|
264
331
|
# Ensure settings directory exists
|
|
265
332
|
self.settings_file.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -270,10 +337,10 @@ class OutputStyleManager:
|
|
|
270
337
|
)
|
|
271
338
|
|
|
272
339
|
self.logger.info(
|
|
273
|
-
f"✅ Activated
|
|
340
|
+
f"✅ Activated {style_name} output style (was: {current_style or 'none'})"
|
|
274
341
|
)
|
|
275
342
|
else:
|
|
276
|
-
self.logger.debug("
|
|
343
|
+
self.logger.debug(f"{style_name} output style already active")
|
|
277
344
|
|
|
278
345
|
return True
|
|
279
346
|
|
|
@@ -319,7 +386,9 @@ class OutputStyleManager:
|
|
|
319
386
|
|
|
320
387
|
return status
|
|
321
388
|
|
|
322
|
-
def get_injectable_content(
|
|
389
|
+
def get_injectable_content(
|
|
390
|
+
self, framework_loader: Any = None, style: OutputStyleType = "professional"
|
|
391
|
+
) -> str:
|
|
323
392
|
"""
|
|
324
393
|
Get output style content for injection into instructions (for Claude < 1.0.83).
|
|
325
394
|
|
|
@@ -328,12 +397,13 @@ class OutputStyleManager:
|
|
|
328
397
|
|
|
329
398
|
Args:
|
|
330
399
|
framework_loader: Optional FrameworkLoader instance to reuse loaded content
|
|
400
|
+
style: Style type to extract ("professional" or "teaching")
|
|
331
401
|
|
|
332
402
|
Returns:
|
|
333
403
|
Simplified output style content for injection
|
|
334
404
|
"""
|
|
335
405
|
# Extract the same content but without YAML frontmatter
|
|
336
|
-
full_content = self.extract_output_style_content(framework_loader)
|
|
406
|
+
full_content = self.extract_output_style_content(framework_loader, style=style)
|
|
337
407
|
|
|
338
408
|
# Remove YAML frontmatter
|
|
339
409
|
lines = full_content.split("\n")
|
|
@@ -351,3 +421,63 @@ class OutputStyleManager:
|
|
|
351
421
|
|
|
352
422
|
# If no frontmatter found, return as-is
|
|
353
423
|
return full_content
|
|
424
|
+
|
|
425
|
+
def deploy_all_styles(self, activate_default: bool = True) -> Dict[str, bool]:
|
|
426
|
+
"""
|
|
427
|
+
Deploy all available output styles to Claude Code.
|
|
428
|
+
|
|
429
|
+
Args:
|
|
430
|
+
activate_default: Whether to activate the professional style after deployment
|
|
431
|
+
|
|
432
|
+
Returns:
|
|
433
|
+
Dictionary mapping style names to deployment success status
|
|
434
|
+
"""
|
|
435
|
+
results: Dict[str, bool] = {}
|
|
436
|
+
|
|
437
|
+
for style_type_key in self.styles:
|
|
438
|
+
# Deploy without activation
|
|
439
|
+
# Cast is safe because we know self.styles keys are OutputStyleType
|
|
440
|
+
style_type = cast("OutputStyleType", style_type_key)
|
|
441
|
+
success = self.deploy_output_style(style=style_type, activate=False)
|
|
442
|
+
results[style_type] = success
|
|
443
|
+
|
|
444
|
+
# Activate the default style if requested
|
|
445
|
+
if activate_default and results.get("professional", False):
|
|
446
|
+
self._activate_output_style("claude-mpm")
|
|
447
|
+
|
|
448
|
+
return results
|
|
449
|
+
|
|
450
|
+
def deploy_teaching_style(self, activate: bool = False) -> bool:
|
|
451
|
+
"""
|
|
452
|
+
Deploy the teaching style specifically.
|
|
453
|
+
|
|
454
|
+
Args:
|
|
455
|
+
activate: Whether to activate the teaching style after deployment
|
|
456
|
+
|
|
457
|
+
Returns:
|
|
458
|
+
True if deployed successfully, False otherwise
|
|
459
|
+
"""
|
|
460
|
+
return self.deploy_output_style(style="teaching", activate=activate)
|
|
461
|
+
|
|
462
|
+
def list_available_styles(self) -> Dict[str, Dict[str, str]]:
|
|
463
|
+
"""
|
|
464
|
+
List all available output styles with their metadata.
|
|
465
|
+
|
|
466
|
+
Returns:
|
|
467
|
+
Dictionary mapping style types to their configuration
|
|
468
|
+
"""
|
|
469
|
+
available_styles = {}
|
|
470
|
+
|
|
471
|
+
for style_type, config in self.styles.items():
|
|
472
|
+
source_exists = config["source"].exists()
|
|
473
|
+
target_exists = config["target"].exists()
|
|
474
|
+
|
|
475
|
+
available_styles[style_type] = {
|
|
476
|
+
"name": config["name"],
|
|
477
|
+
"source_path": str(config["source"]),
|
|
478
|
+
"target_path": str(config["target"]),
|
|
479
|
+
"source_exists": str(source_exists),
|
|
480
|
+
"deployed": str(target_exists),
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return available_styles
|
|
@@ -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
|
+
...
|