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
|
@@ -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,191 @@ 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 (check AFTER finding BASE-AGENT.md)
|
|
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 (check AFTER finding BASE-AGENT.md)
|
|
138
|
+
# Stop at cache root or .claude-mpm directory
|
|
139
|
+
if current_dir.name in [".claude-mpm", "cache"]:
|
|
140
|
+
self.logger.debug(
|
|
141
|
+
f"Reached repository root indicator at: {current_dir}"
|
|
142
|
+
)
|
|
143
|
+
break
|
|
144
|
+
|
|
145
|
+
# Move to parent directory
|
|
146
|
+
parent = current_dir.parent
|
|
147
|
+
if parent == current_dir: # Reached filesystem root
|
|
148
|
+
break
|
|
149
|
+
|
|
150
|
+
current_dir = parent
|
|
151
|
+
depth += 1
|
|
152
|
+
|
|
153
|
+
if base_templates:
|
|
154
|
+
self.logger.info(
|
|
155
|
+
f"Discovered {len(base_templates)} BASE-AGENT.md file(s) for {agent_file.name}"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
return base_templates
|
|
159
|
+
|
|
160
|
+
def _parse_markdown_template(self, template_path: Path) -> dict:
|
|
161
|
+
"""Parse Markdown template with YAML frontmatter.
|
|
162
|
+
|
|
163
|
+
Extracts metadata from YAML frontmatter and content from Markdown body.
|
|
164
|
+
Supports the new agent template format with YAML frontmatter between --- delimiters.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
template_path: Path to the Markdown template file
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
Dictionary containing metadata and instructions
|
|
171
|
+
|
|
172
|
+
Raises:
|
|
173
|
+
ValueError: If frontmatter is missing or malformed
|
|
174
|
+
yaml.YAMLError: If YAML parsing fails
|
|
175
|
+
"""
|
|
176
|
+
content = template_path.read_text(encoding="utf-8")
|
|
177
|
+
|
|
178
|
+
# Split frontmatter and body
|
|
179
|
+
# Format: ---\n<yaml>\n---\n<markdown>
|
|
180
|
+
if not content.startswith("---"):
|
|
181
|
+
raise ValueError(
|
|
182
|
+
f"Markdown template missing YAML frontmatter: {template_path}"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# Split by --- delimiters
|
|
186
|
+
parts = content.split("---", 2)
|
|
187
|
+
if len(parts) < 3:
|
|
188
|
+
raise ValueError(f"Malformed YAML frontmatter in template: {template_path}")
|
|
189
|
+
|
|
190
|
+
# parts[0] is empty (before first ---)
|
|
191
|
+
# parts[1] is YAML frontmatter
|
|
192
|
+
# parts[2] is Markdown content
|
|
193
|
+
yaml_content = parts[1].strip()
|
|
194
|
+
markdown_content = parts[2].strip()
|
|
195
|
+
|
|
196
|
+
# Parse YAML frontmatter
|
|
197
|
+
try:
|
|
198
|
+
metadata = yaml.safe_load(yaml_content)
|
|
199
|
+
if not isinstance(metadata, dict):
|
|
200
|
+
raise ValueError(
|
|
201
|
+
f"YAML frontmatter must be a dictionary: {template_path}"
|
|
202
|
+
)
|
|
203
|
+
except yaml.YAMLError as e:
|
|
204
|
+
self.logger.error(
|
|
205
|
+
f"Failed to parse YAML frontmatter in {template_path}: {e}"
|
|
206
|
+
)
|
|
207
|
+
raise
|
|
208
|
+
|
|
209
|
+
# Validate required fields
|
|
210
|
+
required_fields = ["name", "description", "version"]
|
|
211
|
+
missing_fields = [field for field in required_fields if field not in metadata]
|
|
212
|
+
if missing_fields:
|
|
213
|
+
raise ValueError(
|
|
214
|
+
f"Missing required fields in template {template_path}: {missing_fields}"
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
# Add the markdown content as instructions field
|
|
218
|
+
metadata["instructions"] = markdown_content
|
|
219
|
+
|
|
220
|
+
# Normalize metadata structure to match JSON template format
|
|
221
|
+
# JSON templates have these fields at top level, Markdown may have them nested
|
|
222
|
+
self._normalize_metadata_structure(metadata)
|
|
223
|
+
|
|
224
|
+
return metadata
|
|
225
|
+
|
|
226
|
+
def _normalize_metadata_structure(self, metadata: dict) -> None:
|
|
227
|
+
"""Normalize metadata structure to match expected JSON template format.
|
|
228
|
+
|
|
229
|
+
This ensures both Markdown and JSON templates produce the same metadata structure
|
|
230
|
+
for downstream processing.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
metadata: Metadata dictionary to normalize (modified in-place)
|
|
234
|
+
"""
|
|
235
|
+
# Map Markdown frontmatter fields to JSON template structure
|
|
236
|
+
# Handle tags: YAML list vs JSON comma-separated string
|
|
237
|
+
if "tags" in metadata and isinstance(metadata["tags"], list):
|
|
238
|
+
# Keep as list for now, normalize_tools_input will handle both formats
|
|
239
|
+
pass
|
|
240
|
+
|
|
241
|
+
# Map agent_id to name if name is missing
|
|
242
|
+
if "agent_id" in metadata and "name" not in metadata:
|
|
243
|
+
metadata["name"] = metadata["agent_id"]
|
|
244
|
+
|
|
245
|
+
# Ensure capabilities dict exists
|
|
246
|
+
if "capabilities" not in metadata:
|
|
247
|
+
metadata["capabilities"] = {}
|
|
248
|
+
|
|
249
|
+
# Merge top-level capability fields into capabilities dict
|
|
250
|
+
capability_fields = ["memory_limit", "cpu_limit", "network_access"]
|
|
251
|
+
for field in capability_fields:
|
|
252
|
+
if field in metadata:
|
|
253
|
+
metadata["capabilities"][field] = metadata.pop(field)
|
|
254
|
+
|
|
255
|
+
# Add model to capabilities if present at top level
|
|
256
|
+
if "model" in metadata and "model" not in metadata["capabilities"]:
|
|
257
|
+
metadata["capabilities"]["model"] = metadata["model"]
|
|
258
|
+
|
|
79
259
|
def _load_base_agent_instructions(self, agent_type: str) -> str:
|
|
80
260
|
"""Load BASE instructions for a specific agent type.
|
|
81
261
|
|
|
262
|
+
DEPRECATED: This method loads BASE_{TYPE}.md files (old pattern).
|
|
263
|
+
New pattern uses hierarchical BASE-AGENT.md files discovered via
|
|
264
|
+
_discover_base_agent_templates() and composed in build_agent_markdown().
|
|
265
|
+
|
|
82
266
|
Args:
|
|
83
267
|
agent_type: The type of agent (engineer, qa, ops, research, documentation)
|
|
84
268
|
|
|
@@ -156,7 +340,7 @@ class AgentTemplateBuilder:
|
|
|
156
340
|
|
|
157
341
|
Args:
|
|
158
342
|
agent_name: Name of the agent
|
|
159
|
-
template_path: Path to the agent template JSON file
|
|
343
|
+
template_path: Path to the agent template (JSON or Markdown file)
|
|
160
344
|
base_agent_data: Base agent configuration data
|
|
161
345
|
source_info: Source of the agent (system/project/user)
|
|
162
346
|
|
|
@@ -166,16 +350,34 @@ class AgentTemplateBuilder:
|
|
|
166
350
|
Raises:
|
|
167
351
|
FileNotFoundError: If template file doesn't exist
|
|
168
352
|
json.JSONDecodeError: If template JSON is invalid
|
|
353
|
+
yaml.YAMLError: If template YAML is invalid
|
|
354
|
+
ValueError: If template format is unsupported or malformed
|
|
169
355
|
"""
|
|
170
356
|
if not template_path.exists():
|
|
171
357
|
raise FileNotFoundError(f"Template file not found: {template_path}")
|
|
172
358
|
|
|
359
|
+
# Format detection: route to appropriate parser
|
|
173
360
|
try:
|
|
174
|
-
|
|
175
|
-
|
|
361
|
+
if template_path.suffix == ".md":
|
|
362
|
+
# Parse Markdown template with YAML frontmatter
|
|
363
|
+
self.logger.debug(f"Parsing Markdown template: {template_path}")
|
|
364
|
+
template_data = self._parse_markdown_template(template_path)
|
|
365
|
+
elif template_path.suffix == ".json":
|
|
366
|
+
# Parse JSON template (legacy format)
|
|
367
|
+
self.logger.debug(f"Parsing JSON template: {template_path}")
|
|
368
|
+
template_content = template_path.read_text()
|
|
369
|
+
template_data = json.loads(template_content)
|
|
370
|
+
else:
|
|
371
|
+
raise ValueError(
|
|
372
|
+
f"Unsupported template format: {template_path.suffix}. "
|
|
373
|
+
f"Expected .md or .json"
|
|
374
|
+
)
|
|
176
375
|
except json.JSONDecodeError as e:
|
|
177
376
|
self.logger.error(f"Invalid JSON in template {template_path}: {e}")
|
|
178
377
|
raise
|
|
378
|
+
except (yaml.YAMLError, ValueError) as e:
|
|
379
|
+
self.logger.error(f"Invalid template {template_path}: {e}")
|
|
380
|
+
raise
|
|
179
381
|
|
|
180
382
|
# Extract tools from template with fallback
|
|
181
383
|
# Handle both dict and list formats for capabilities (backward compatibility)
|
|
@@ -392,9 +594,6 @@ class AgentTemplateBuilder:
|
|
|
392
594
|
|
|
393
595
|
frontmatter = "\n".join(frontmatter_lines)
|
|
394
596
|
|
|
395
|
-
# Load BASE instructions for this agent type
|
|
396
|
-
base_instructions = self._load_base_agent_instructions(agent_type)
|
|
397
|
-
|
|
398
597
|
# Get agent instructions from template data (primary) or base agent data (fallback)
|
|
399
598
|
raw_instructions = template_data.get("instructions")
|
|
400
599
|
|
|
@@ -411,15 +610,38 @@ class AgentTemplateBuilder:
|
|
|
411
610
|
or "# Agent Instructions\n\nThis agent provides specialized assistance."
|
|
412
611
|
)
|
|
413
612
|
|
|
414
|
-
#
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
613
|
+
# Compose hierarchical BASE-AGENT.md templates
|
|
614
|
+
# Order: agent-specific + local BASE + parent BASE + ... + root BASE
|
|
615
|
+
content_parts = [agent_specific_instructions]
|
|
616
|
+
|
|
617
|
+
# Discover BASE-AGENT.md files in directory hierarchy
|
|
618
|
+
base_templates = self._discover_base_agent_templates(template_path)
|
|
619
|
+
|
|
620
|
+
# Append each BASE template (order: closest to farthest)
|
|
621
|
+
for base_template_path in base_templates:
|
|
622
|
+
try:
|
|
623
|
+
base_content = base_template_path.read_text(encoding="utf-8")
|
|
624
|
+
if base_content.strip():
|
|
625
|
+
content_parts.append(base_content)
|
|
626
|
+
self.logger.debug(
|
|
627
|
+
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}"
|
|
628
|
+
)
|
|
629
|
+
except Exception as e:
|
|
630
|
+
self.logger.warning(
|
|
631
|
+
f"Failed to read BASE template {base_template_path}: {e}"
|
|
632
|
+
)
|
|
633
|
+
|
|
634
|
+
# Fallback: Load legacy BASE_{TYPE}.md if no hierarchical templates found
|
|
635
|
+
if len(content_parts) == 1: # Only agent-specific instructions
|
|
636
|
+
legacy_base_instructions = self._load_base_agent_instructions(agent_type)
|
|
637
|
+
if legacy_base_instructions:
|
|
638
|
+
content_parts.append(legacy_base_instructions)
|
|
639
|
+
self.logger.debug(
|
|
640
|
+
f"Using legacy BASE_{agent_type.upper()}.md (no hierarchical BASE-AGENT.md found)"
|
|
641
|
+
)
|
|
642
|
+
|
|
643
|
+
# Join all parts with separator
|
|
644
|
+
content = "\n\n---\n\n".join(content_parts)
|
|
423
645
|
|
|
424
646
|
# Add memory update instructions if not already present
|
|
425
647
|
if "memory-update" not in content and "Remember" not in content:
|
|
@@ -454,6 +676,7 @@ Only include memories that are:
|
|
|
454
676
|
"""
|
|
455
677
|
content = content + memory_instructions
|
|
456
678
|
|
|
679
|
+
# Combine frontmatter and content
|
|
457
680
|
return frontmatter + content
|
|
458
681
|
|
|
459
682
|
def build_agent_yaml(
|
|
@@ -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/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/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
|
|