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
|
@@ -12,6 +12,8 @@ import re
|
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
from typing import Any, Dict, List
|
|
14
14
|
|
|
15
|
+
import yaml
|
|
16
|
+
|
|
15
17
|
from claude_mpm.core.logging_config import get_logger
|
|
16
18
|
|
|
17
19
|
|
|
@@ -76,9 +78,190 @@ class AgentTemplateBuilder:
|
|
|
76
78
|
|
|
77
79
|
return tool_list
|
|
78
80
|
|
|
81
|
+
def _discover_base_agent_templates(self, agent_file: Path) -> List[Path]:
|
|
82
|
+
"""Discover BASE-AGENT.md files in hierarchy from agent file to repository root.
|
|
83
|
+
|
|
84
|
+
This method implements hierarchical BASE template discovery by walking up the
|
|
85
|
+
directory tree from the agent file location and collecting all BASE-AGENT.md
|
|
86
|
+
files found along the way.
|
|
87
|
+
|
|
88
|
+
Composition Order (closest to farthest):
|
|
89
|
+
1. Local BASE-AGENT.md (same directory as agent)
|
|
90
|
+
2. Parent BASE-AGENT.md (parent directory)
|
|
91
|
+
3. Grandparent BASE-AGENT.md (grandparent directory)
|
|
92
|
+
... continuing to repository root
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
agent_file: Path to the agent template file
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
List of BASE-AGENT.md paths ordered from closest to farthest
|
|
99
|
+
(same directory to root)
|
|
100
|
+
|
|
101
|
+
Example:
|
|
102
|
+
Given structure:
|
|
103
|
+
repo/
|
|
104
|
+
BASE-AGENT.md # Root (index 2)
|
|
105
|
+
engineering/
|
|
106
|
+
BASE-AGENT.md # Parent (index 1)
|
|
107
|
+
python/
|
|
108
|
+
BASE-AGENT.md # Local (index 0)
|
|
109
|
+
fastapi-engineer.md # Agent file
|
|
110
|
+
|
|
111
|
+
Returns: [
|
|
112
|
+
repo/engineering/python/BASE-AGENT.md,
|
|
113
|
+
repo/engineering/BASE-AGENT.md,
|
|
114
|
+
repo/BASE-AGENT.md
|
|
115
|
+
]
|
|
116
|
+
"""
|
|
117
|
+
base_templates = []
|
|
118
|
+
current_dir = agent_file.parent
|
|
119
|
+
|
|
120
|
+
# Walk up directory tree until we reach root or a reasonable limit
|
|
121
|
+
# Stop at repository root or after 10 levels (safety limit)
|
|
122
|
+
max_depth = 10
|
|
123
|
+
depth = 0
|
|
124
|
+
|
|
125
|
+
while current_dir and depth < max_depth:
|
|
126
|
+
# Check for BASE-AGENT.md in current directory
|
|
127
|
+
base_agent_file = current_dir / "BASE-AGENT.md"
|
|
128
|
+
if base_agent_file.exists() and base_agent_file.is_file():
|
|
129
|
+
base_templates.append(base_agent_file)
|
|
130
|
+
self.logger.debug(f"Found BASE-AGENT.md at: {base_agent_file}")
|
|
131
|
+
|
|
132
|
+
# Stop at git repository root if detected
|
|
133
|
+
if (current_dir / ".git").exists():
|
|
134
|
+
self.logger.debug(f"Reached git repository root at: {current_dir}")
|
|
135
|
+
break
|
|
136
|
+
|
|
137
|
+
# Stop at common repository root indicators
|
|
138
|
+
if current_dir.name in [".claude-mpm", "remote-agents", "cache"]:
|
|
139
|
+
self.logger.debug(
|
|
140
|
+
f"Reached repository root indicator at: {current_dir}"
|
|
141
|
+
)
|
|
142
|
+
break
|
|
143
|
+
|
|
144
|
+
# Move to parent directory
|
|
145
|
+
parent = current_dir.parent
|
|
146
|
+
if parent == current_dir: # Reached filesystem root
|
|
147
|
+
break
|
|
148
|
+
|
|
149
|
+
current_dir = parent
|
|
150
|
+
depth += 1
|
|
151
|
+
|
|
152
|
+
if base_templates:
|
|
153
|
+
self.logger.info(
|
|
154
|
+
f"Discovered {len(base_templates)} BASE-AGENT.md file(s) for {agent_file.name}"
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
return base_templates
|
|
158
|
+
|
|
159
|
+
def _parse_markdown_template(self, template_path: Path) -> dict:
|
|
160
|
+
"""Parse Markdown template with YAML frontmatter.
|
|
161
|
+
|
|
162
|
+
Extracts metadata from YAML frontmatter and content from Markdown body.
|
|
163
|
+
Supports the new agent template format with YAML frontmatter between --- delimiters.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
template_path: Path to the Markdown template file
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
Dictionary containing metadata and instructions
|
|
170
|
+
|
|
171
|
+
Raises:
|
|
172
|
+
ValueError: If frontmatter is missing or malformed
|
|
173
|
+
yaml.YAMLError: If YAML parsing fails
|
|
174
|
+
"""
|
|
175
|
+
content = template_path.read_text(encoding="utf-8")
|
|
176
|
+
|
|
177
|
+
# Split frontmatter and body
|
|
178
|
+
# Format: ---\n<yaml>\n---\n<markdown>
|
|
179
|
+
if not content.startswith("---"):
|
|
180
|
+
raise ValueError(
|
|
181
|
+
f"Markdown template missing YAML frontmatter: {template_path}"
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# Split by --- delimiters
|
|
185
|
+
parts = content.split("---", 2)
|
|
186
|
+
if len(parts) < 3:
|
|
187
|
+
raise ValueError(f"Malformed YAML frontmatter in template: {template_path}")
|
|
188
|
+
|
|
189
|
+
# parts[0] is empty (before first ---)
|
|
190
|
+
# parts[1] is YAML frontmatter
|
|
191
|
+
# parts[2] is Markdown content
|
|
192
|
+
yaml_content = parts[1].strip()
|
|
193
|
+
markdown_content = parts[2].strip()
|
|
194
|
+
|
|
195
|
+
# Parse YAML frontmatter
|
|
196
|
+
try:
|
|
197
|
+
metadata = yaml.safe_load(yaml_content)
|
|
198
|
+
if not isinstance(metadata, dict):
|
|
199
|
+
raise ValueError(
|
|
200
|
+
f"YAML frontmatter must be a dictionary: {template_path}"
|
|
201
|
+
)
|
|
202
|
+
except yaml.YAMLError as e:
|
|
203
|
+
self.logger.error(
|
|
204
|
+
f"Failed to parse YAML frontmatter in {template_path}: {e}"
|
|
205
|
+
)
|
|
206
|
+
raise
|
|
207
|
+
|
|
208
|
+
# Validate required fields
|
|
209
|
+
required_fields = ["name", "description", "version"]
|
|
210
|
+
missing_fields = [field for field in required_fields if field not in metadata]
|
|
211
|
+
if missing_fields:
|
|
212
|
+
raise ValueError(
|
|
213
|
+
f"Missing required fields in template {template_path}: {missing_fields}"
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
# Add the markdown content as instructions field
|
|
217
|
+
metadata["instructions"] = markdown_content
|
|
218
|
+
|
|
219
|
+
# Normalize metadata structure to match JSON template format
|
|
220
|
+
# JSON templates have these fields at top level, Markdown may have them nested
|
|
221
|
+
self._normalize_metadata_structure(metadata)
|
|
222
|
+
|
|
223
|
+
return metadata
|
|
224
|
+
|
|
225
|
+
def _normalize_metadata_structure(self, metadata: dict) -> None:
|
|
226
|
+
"""Normalize metadata structure to match expected JSON template format.
|
|
227
|
+
|
|
228
|
+
This ensures both Markdown and JSON templates produce the same metadata structure
|
|
229
|
+
for downstream processing.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
metadata: Metadata dictionary to normalize (modified in-place)
|
|
233
|
+
"""
|
|
234
|
+
# Map Markdown frontmatter fields to JSON template structure
|
|
235
|
+
# Handle tags: YAML list vs JSON comma-separated string
|
|
236
|
+
if "tags" in metadata and isinstance(metadata["tags"], list):
|
|
237
|
+
# Keep as list for now, normalize_tools_input will handle both formats
|
|
238
|
+
pass
|
|
239
|
+
|
|
240
|
+
# Map agent_id to name if name is missing
|
|
241
|
+
if "agent_id" in metadata and "name" not in metadata:
|
|
242
|
+
metadata["name"] = metadata["agent_id"]
|
|
243
|
+
|
|
244
|
+
# Ensure capabilities dict exists
|
|
245
|
+
if "capabilities" not in metadata:
|
|
246
|
+
metadata["capabilities"] = {}
|
|
247
|
+
|
|
248
|
+
# Merge top-level capability fields into capabilities dict
|
|
249
|
+
capability_fields = ["memory_limit", "cpu_limit", "network_access"]
|
|
250
|
+
for field in capability_fields:
|
|
251
|
+
if field in metadata:
|
|
252
|
+
metadata["capabilities"][field] = metadata.pop(field)
|
|
253
|
+
|
|
254
|
+
# Add model to capabilities if present at top level
|
|
255
|
+
if "model" in metadata and "model" not in metadata["capabilities"]:
|
|
256
|
+
metadata["capabilities"]["model"] = metadata["model"]
|
|
257
|
+
|
|
79
258
|
def _load_base_agent_instructions(self, agent_type: str) -> str:
|
|
80
259
|
"""Load BASE instructions for a specific agent type.
|
|
81
260
|
|
|
261
|
+
DEPRECATED: This method loads BASE_{TYPE}.md files (old pattern).
|
|
262
|
+
New pattern uses hierarchical BASE-AGENT.md files discovered via
|
|
263
|
+
_discover_base_agent_templates() and composed in build_agent_markdown().
|
|
264
|
+
|
|
82
265
|
Args:
|
|
83
266
|
agent_type: The type of agent (engineer, qa, ops, research, documentation)
|
|
84
267
|
|
|
@@ -156,7 +339,7 @@ class AgentTemplateBuilder:
|
|
|
156
339
|
|
|
157
340
|
Args:
|
|
158
341
|
agent_name: Name of the agent
|
|
159
|
-
template_path: Path to the agent template JSON file
|
|
342
|
+
template_path: Path to the agent template (JSON or Markdown file)
|
|
160
343
|
base_agent_data: Base agent configuration data
|
|
161
344
|
source_info: Source of the agent (system/project/user)
|
|
162
345
|
|
|
@@ -166,16 +349,34 @@ class AgentTemplateBuilder:
|
|
|
166
349
|
Raises:
|
|
167
350
|
FileNotFoundError: If template file doesn't exist
|
|
168
351
|
json.JSONDecodeError: If template JSON is invalid
|
|
352
|
+
yaml.YAMLError: If template YAML is invalid
|
|
353
|
+
ValueError: If template format is unsupported or malformed
|
|
169
354
|
"""
|
|
170
355
|
if not template_path.exists():
|
|
171
356
|
raise FileNotFoundError(f"Template file not found: {template_path}")
|
|
172
357
|
|
|
358
|
+
# Format detection: route to appropriate parser
|
|
173
359
|
try:
|
|
174
|
-
|
|
175
|
-
|
|
360
|
+
if template_path.suffix == ".md":
|
|
361
|
+
# Parse Markdown template with YAML frontmatter
|
|
362
|
+
self.logger.debug(f"Parsing Markdown template: {template_path}")
|
|
363
|
+
template_data = self._parse_markdown_template(template_path)
|
|
364
|
+
elif template_path.suffix == ".json":
|
|
365
|
+
# Parse JSON template (legacy format)
|
|
366
|
+
self.logger.debug(f"Parsing JSON template: {template_path}")
|
|
367
|
+
template_content = template_path.read_text()
|
|
368
|
+
template_data = json.loads(template_content)
|
|
369
|
+
else:
|
|
370
|
+
raise ValueError(
|
|
371
|
+
f"Unsupported template format: {template_path.suffix}. "
|
|
372
|
+
f"Expected .md or .json"
|
|
373
|
+
)
|
|
176
374
|
except json.JSONDecodeError as e:
|
|
177
375
|
self.logger.error(f"Invalid JSON in template {template_path}: {e}")
|
|
178
376
|
raise
|
|
377
|
+
except (yaml.YAMLError, ValueError) as e:
|
|
378
|
+
self.logger.error(f"Invalid template {template_path}: {e}")
|
|
379
|
+
raise
|
|
179
380
|
|
|
180
381
|
# Extract tools from template with fallback
|
|
181
382
|
# Handle both dict and list formats for capabilities (backward compatibility)
|
|
@@ -392,9 +593,6 @@ class AgentTemplateBuilder:
|
|
|
392
593
|
|
|
393
594
|
frontmatter = "\n".join(frontmatter_lines)
|
|
394
595
|
|
|
395
|
-
# Load BASE instructions for this agent type
|
|
396
|
-
base_instructions = self._load_base_agent_instructions(agent_type)
|
|
397
|
-
|
|
398
596
|
# Get agent instructions from template data (primary) or base agent data (fallback)
|
|
399
597
|
raw_instructions = template_data.get("instructions")
|
|
400
598
|
|
|
@@ -411,15 +609,38 @@ class AgentTemplateBuilder:
|
|
|
411
609
|
or "# Agent Instructions\n\nThis agent provides specialized assistance."
|
|
412
610
|
)
|
|
413
611
|
|
|
414
|
-
#
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
612
|
+
# Compose hierarchical BASE-AGENT.md templates
|
|
613
|
+
# Order: agent-specific + local BASE + parent BASE + ... + root BASE
|
|
614
|
+
content_parts = [agent_specific_instructions]
|
|
615
|
+
|
|
616
|
+
# Discover BASE-AGENT.md files in directory hierarchy
|
|
617
|
+
base_templates = self._discover_base_agent_templates(template_path)
|
|
618
|
+
|
|
619
|
+
# Append each BASE template (order: closest to farthest)
|
|
620
|
+
for base_template_path in base_templates:
|
|
621
|
+
try:
|
|
622
|
+
base_content = base_template_path.read_text(encoding="utf-8")
|
|
623
|
+
if base_content.strip():
|
|
624
|
+
content_parts.append(base_content)
|
|
625
|
+
self.logger.debug(
|
|
626
|
+
f"Composed BASE template: {base_template_path.relative_to(template_path.parent.parent) if template_path.parent.parent in base_template_path.parents else base_template_path.name}"
|
|
627
|
+
)
|
|
628
|
+
except Exception as e:
|
|
629
|
+
self.logger.warning(
|
|
630
|
+
f"Failed to read BASE template {base_template_path}: {e}"
|
|
631
|
+
)
|
|
632
|
+
|
|
633
|
+
# Fallback: Load legacy BASE_{TYPE}.md if no hierarchical templates found
|
|
634
|
+
if len(content_parts) == 1: # Only agent-specific instructions
|
|
635
|
+
legacy_base_instructions = self._load_base_agent_instructions(agent_type)
|
|
636
|
+
if legacy_base_instructions:
|
|
637
|
+
content_parts.append(legacy_base_instructions)
|
|
638
|
+
self.logger.debug(
|
|
639
|
+
f"Using legacy BASE_{agent_type.upper()}.md (no hierarchical BASE-AGENT.md found)"
|
|
640
|
+
)
|
|
641
|
+
|
|
642
|
+
# Join all parts with separator
|
|
643
|
+
content = "\n\n---\n\n".join(content_parts)
|
|
423
644
|
|
|
424
645
|
# Add memory update instructions if not already present
|
|
425
646
|
if "memory-update" not in content and "Remember" not in content:
|
|
@@ -2,6 +2,47 @@
|
|
|
2
2
|
|
|
3
3
|
This module handles determining the correct agents directory for deployment
|
|
4
4
|
based on different deployment scenarios and target directories.
|
|
5
|
+
|
|
6
|
+
DEPLOYMENT ARCHITECTURE:
|
|
7
|
+
=======================
|
|
8
|
+
|
|
9
|
+
Agent Source Locations (Discovery):
|
|
10
|
+
-----------------------------------
|
|
11
|
+
1. System Agents: ~/.claude-mpm/cache/remote-agents/bobmatnyc/claude-mpm-agents/
|
|
12
|
+
- Synced from GitHub repository
|
|
13
|
+
- Read-only (managed by git pull)
|
|
14
|
+
- 44+ agents organized by category
|
|
15
|
+
|
|
16
|
+
2. User Agents: ~/.claude-mpm/agents/
|
|
17
|
+
- User-created custom agents
|
|
18
|
+
- Personal agent definitions
|
|
19
|
+
|
|
20
|
+
3. Project Agents: .claude-mpm/agents/
|
|
21
|
+
- Project-specific agents
|
|
22
|
+
- Overrides for system/user agents
|
|
23
|
+
|
|
24
|
+
Agent Deployment Target (Runtime):
|
|
25
|
+
----------------------------------
|
|
26
|
+
ALL AGENTS DEPLOY TO: <project_root>/.claude/agents/
|
|
27
|
+
- Single deployment location for ALL agents (system, user, project)
|
|
28
|
+
- Claude Code discovers agents from this directory
|
|
29
|
+
- Ensures consistent agent availability across sessions
|
|
30
|
+
- Simplifies agent management and version control
|
|
31
|
+
|
|
32
|
+
Why Project-Level Deployment?
|
|
33
|
+
------------------------------
|
|
34
|
+
1. **Consistency**: All team members work with same agents
|
|
35
|
+
2. **Versioning**: Agent deployments tracked in git
|
|
36
|
+
3. **Isolation**: Different projects can have different agent versions
|
|
37
|
+
4. **Performance**: No global agent conflicts or version mismatches
|
|
38
|
+
|
|
39
|
+
Example Flow:
|
|
40
|
+
-------------
|
|
41
|
+
1. User runs: claude-mpm agents deploy
|
|
42
|
+
2. Agents synced from GitHub → ~/.claude-mpm/cache/remote-agents/
|
|
43
|
+
3. Agents deployed FROM cache → .claude/agents/
|
|
44
|
+
4. Claude Code discovers agents FROM .claude/agents/
|
|
45
|
+
|
|
5
46
|
Extracted from AgentDeploymentService to reduce complexity.
|
|
6
47
|
"""
|
|
7
48
|
|
|
@@ -28,36 +69,81 @@ class AgentsDirectoryResolver:
|
|
|
28
69
|
"""
|
|
29
70
|
Determine the correct agents directory based on input.
|
|
30
71
|
|
|
31
|
-
|
|
32
|
-
|
|
72
|
+
DEPLOYMENT STRATEGY:
|
|
73
|
+
====================
|
|
74
|
+
Always deploy to project .claude/agents directory regardless of agent
|
|
75
|
+
source (system, user, or project). This ensures:
|
|
76
|
+
- All agents available in single location
|
|
77
|
+
- Claude Code agent discovery works consistently
|
|
78
|
+
- Version control tracks deployed agents
|
|
79
|
+
- No global agent conflicts between projects
|
|
33
80
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
(
|
|
81
|
+
LOGIC FLOW:
|
|
82
|
+
-----------
|
|
83
|
+
1. If target_dir is None (default case):
|
|
84
|
+
→ Deploy to: <working_directory>/.claude/agents
|
|
85
|
+
→ This is 99% of use cases (standard deployment)
|
|
86
|
+
|
|
87
|
+
2. If target_dir is provided explicitly:
|
|
88
|
+
→ Normalize the path based on directory name:
|
|
89
|
+
- Already "agents" directory? → Use as-is
|
|
90
|
+
- Is ".claude-mpm" directory? → Add /agents
|
|
91
|
+
- Is ".claude" directory? → Add /agents
|
|
92
|
+
- Otherwise? → Treat as project root, add /.claude/agents
|
|
93
|
+
|
|
94
|
+
EXAMPLES:
|
|
95
|
+
---------
|
|
96
|
+
Standard deployment (target_dir=None):
|
|
97
|
+
working_directory = /Users/masa/Projects/my-app
|
|
98
|
+
→ Returns: /Users/masa/Projects/my-app/.claude/agents
|
|
99
|
+
|
|
100
|
+
Explicit target (target_dir="/some/path/.claude"):
|
|
101
|
+
→ Returns: /some/path/.claude/agents
|
|
102
|
+
|
|
103
|
+
Explicit target (target_dir="/some/path/.claude/agents"):
|
|
104
|
+
→ Returns: /some/path/.claude/agents (no modification)
|
|
37
105
|
|
|
38
106
|
Args:
|
|
39
|
-
target_dir: Optional target directory
|
|
107
|
+
target_dir: Optional target directory override
|
|
108
|
+
None = use default project .claude/agents (recommended)
|
|
109
|
+
Path = explicitly specify deployment location (advanced)
|
|
40
110
|
|
|
41
111
|
Returns:
|
|
42
|
-
Path
|
|
112
|
+
Path: Resolved agents directory path
|
|
113
|
+
|
|
114
|
+
Note:
|
|
115
|
+
The default behavior (target_dir=None) is the recommended approach.
|
|
116
|
+
Only provide target_dir for advanced use cases or testing.
|
|
43
117
|
"""
|
|
44
118
|
if not target_dir:
|
|
45
|
-
#
|
|
46
|
-
# This is the
|
|
119
|
+
# DEFAULT CASE: Deploy to project .claude/agents directory
|
|
120
|
+
# This is the standard behavior for all normal deployments
|
|
121
|
+
# Example: /Users/masa/Projects/my-app → /Users/masa/Projects/my-app/.claude/agents
|
|
47
122
|
return self.working_directory / ".claude" / "agents"
|
|
48
123
|
|
|
49
|
-
#
|
|
124
|
+
# EXPLICIT TARGET CASE: User/caller provided specific target directory
|
|
125
|
+
# Normalize target_dir to proper agents directory based on structure
|
|
50
126
|
target_dir = Path(target_dir)
|
|
51
127
|
|
|
52
|
-
#
|
|
128
|
+
# Pattern 1: Already an agents directory
|
|
53
129
|
if target_dir.name == "agents":
|
|
54
|
-
# Already
|
|
130
|
+
# Already targeting agents dir explicitly, use as-is
|
|
131
|
+
# Example: /some/path/.claude/agents → /some/path/.claude/agents
|
|
55
132
|
return target_dir
|
|
133
|
+
|
|
134
|
+
# Pattern 2: Targeting .claude-mpm directory
|
|
56
135
|
if target_dir.name == ".claude-mpm":
|
|
57
|
-
# .claude-mpm
|
|
136
|
+
# Add agents subdirectory to .claude-mpm
|
|
137
|
+
# Example: /some/path/.claude-mpm → /some/path/.claude-mpm/agents
|
|
58
138
|
return target_dir / "agents"
|
|
139
|
+
|
|
140
|
+
# Pattern 3: Targeting .claude directory
|
|
59
141
|
if target_dir.name == ".claude":
|
|
60
|
-
#
|
|
142
|
+
# Add agents subdirectory to .claude
|
|
143
|
+
# Example: /some/path/.claude → /some/path/.claude/agents
|
|
61
144
|
return target_dir / "agents"
|
|
62
|
-
|
|
145
|
+
|
|
146
|
+
# Pattern 4: Targeting project root or other directory
|
|
147
|
+
# Assume it's a project directory, add full .claude/agents path
|
|
148
|
+
# Example: /some/project → /some/project/.claude/agents
|
|
63
149
|
return target_dir / ".claude" / "agents"
|
|
@@ -200,9 +200,10 @@ class AsyncAgentDeploymentService:
|
|
|
200
200
|
return str(directory), []
|
|
201
201
|
|
|
202
202
|
# Use asyncio to run glob in executor (since Path.glob is blocking)
|
|
203
|
+
# Agent templates migrated to Markdown with YAML frontmatter (v4.26.0+)
|
|
203
204
|
loop = asyncio.get_event_loop()
|
|
204
205
|
files = await loop.run_in_executor(
|
|
205
|
-
self.executor, lambda: list(directory.glob("*.
|
|
206
|
+
self.executor, lambda: list(directory.glob("*.md"))
|
|
206
207
|
)
|
|
207
208
|
|
|
208
209
|
self.logger.debug(f"Found {len(files)} agents in {directory}")
|
|
@@ -89,9 +89,9 @@ class DeploymentFacade:
|
|
|
89
89
|
|
|
90
90
|
results["metadata"]["facade_version"] = "1.0.0"
|
|
91
91
|
results["metadata"]["selected_executor"] = executor.get_executor_name()
|
|
92
|
-
results["metadata"][
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
results["metadata"]["executor_characteristics"] = (
|
|
93
|
+
executor.get_performance_characteristics()
|
|
94
|
+
)
|
|
95
95
|
|
|
96
96
|
return results
|
|
97
97
|
|