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
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"""Service for managing agent preset configurations.
|
|
2
|
+
|
|
3
|
+
This service resolves preset names to concrete agent lists, validates preset
|
|
4
|
+
availability against configured sources, and provides metadata for CLI display.
|
|
5
|
+
|
|
6
|
+
Design Decision: Separate service layer for presets
|
|
7
|
+
Rationale: Keeps CLI commands thin, enables easy testing, allows preset logic
|
|
8
|
+
to be reused across multiple command interfaces.
|
|
9
|
+
|
|
10
|
+
Trade-offs:
|
|
11
|
+
- Abstraction: Added layer vs. direct preset access in CLI
|
|
12
|
+
- Testability: Easy to mock service in CLI tests
|
|
13
|
+
- Reusability: Preset logic available to web UI, API, etc.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from typing import Any, Dict, List
|
|
17
|
+
|
|
18
|
+
from ...config.agent_presets import (
|
|
19
|
+
PRESETS,
|
|
20
|
+
get_preset_agents,
|
|
21
|
+
get_preset_info,
|
|
22
|
+
get_preset_names,
|
|
23
|
+
)
|
|
24
|
+
from ...core.logging_config import get_logger
|
|
25
|
+
from .git_source_manager import GitSourceManager
|
|
26
|
+
|
|
27
|
+
logger = get_logger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class AgentPresetService:
|
|
31
|
+
"""Service for resolving and validating agent presets.
|
|
32
|
+
|
|
33
|
+
This service bridges preset definitions and git source management,
|
|
34
|
+
providing a unified interface for preset-based agent deployment.
|
|
35
|
+
|
|
36
|
+
Attributes:
|
|
37
|
+
source_manager: GitSourceManager for agent resolution
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, source_manager: GitSourceManager):
|
|
41
|
+
"""Initialize with GitSourceManager for agent resolution.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
source_manager: GitSourceManager instance for accessing agent sources
|
|
45
|
+
"""
|
|
46
|
+
self.source_manager = source_manager
|
|
47
|
+
|
|
48
|
+
def list_presets(self) -> List[Dict[str, Any]]:
|
|
49
|
+
"""List all available presets with metadata.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
List of preset info dicts with keys:
|
|
53
|
+
- name: Preset name (str)
|
|
54
|
+
- description: Human-readable description (str)
|
|
55
|
+
- agent_count: Number of agents in preset (int)
|
|
56
|
+
- use_cases: List of use case strings (List[str])
|
|
57
|
+
|
|
58
|
+
Example:
|
|
59
|
+
>>> service = AgentPresetService(source_manager)
|
|
60
|
+
>>> presets = service.list_presets()
|
|
61
|
+
>>> len(presets) >= 10
|
|
62
|
+
True
|
|
63
|
+
>>> all('name' in p for p in presets)
|
|
64
|
+
True
|
|
65
|
+
"""
|
|
66
|
+
return [get_preset_info(name) for name in get_preset_names()]
|
|
67
|
+
|
|
68
|
+
def validate_preset(self, preset_name: str) -> bool:
|
|
69
|
+
"""Check if preset name is valid.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
preset_name: Name of preset to validate
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
True if preset exists, False otherwise
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
>>> service.validate_preset('minimal')
|
|
79
|
+
True
|
|
80
|
+
>>> service.validate_preset('invalid-preset')
|
|
81
|
+
False
|
|
82
|
+
"""
|
|
83
|
+
return preset_name in PRESETS
|
|
84
|
+
|
|
85
|
+
def get_preset_agents(self, preset_name: str) -> List[str]:
|
|
86
|
+
"""Get agent list for preset.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
preset_name: Name of preset
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
List of agent IDs (e.g., ["universal/memory-manager", ...])
|
|
93
|
+
|
|
94
|
+
Raises:
|
|
95
|
+
ValueError: If preset name invalid
|
|
96
|
+
|
|
97
|
+
Example:
|
|
98
|
+
>>> agents = service.get_preset_agents('minimal')
|
|
99
|
+
>>> len(agents)
|
|
100
|
+
6
|
|
101
|
+
"""
|
|
102
|
+
return get_preset_agents(preset_name)
|
|
103
|
+
|
|
104
|
+
def resolve_agents(
|
|
105
|
+
self, preset_name: str, validate_availability: bool = True
|
|
106
|
+
) -> Dict[str, Any]:
|
|
107
|
+
"""Resolve preset to actual agent definitions from configured sources.
|
|
108
|
+
|
|
109
|
+
This method cross-references preset agent IDs with available agents
|
|
110
|
+
from configured git sources, detecting missing agents and conflicts.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
preset_name: Name of preset
|
|
114
|
+
validate_availability: Check if agents exist in sources
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
Dict with keys:
|
|
118
|
+
- preset_info: Preset metadata (dict)
|
|
119
|
+
- agents: List of agent dicts with source attribution (List[dict])
|
|
120
|
+
- missing_agents: List of agent IDs not found (List[str])
|
|
121
|
+
- conflicts: List of agents found in multiple sources (List[dict])
|
|
122
|
+
|
|
123
|
+
Raises:
|
|
124
|
+
ValueError: If preset name invalid
|
|
125
|
+
|
|
126
|
+
Example:
|
|
127
|
+
>>> result = service.resolve_agents('minimal', validate_availability=True)
|
|
128
|
+
>>> 'preset_info' in result
|
|
129
|
+
True
|
|
130
|
+
>>> 'agents' in result
|
|
131
|
+
True
|
|
132
|
+
>>> 'missing_agents' in result
|
|
133
|
+
True
|
|
134
|
+
|
|
135
|
+
Design Decision: Graceful degradation for missing agents
|
|
136
|
+
Rationale: Allow deployment to proceed with warnings rather than
|
|
137
|
+
failing completely. Users may have subset of sources configured.
|
|
138
|
+
"""
|
|
139
|
+
logger.debug(f"[DEBUG] resolve_agents START: preset_name={preset_name}")
|
|
140
|
+
|
|
141
|
+
if not self.validate_preset(preset_name):
|
|
142
|
+
raise ValueError(f"Unknown preset: {preset_name}")
|
|
143
|
+
|
|
144
|
+
logger.debug("[DEBUG] Validation passed")
|
|
145
|
+
preset_info = get_preset_info(preset_name)
|
|
146
|
+
logger.debug(f"[DEBUG] Got preset info: {preset_info.get('name')}")
|
|
147
|
+
|
|
148
|
+
agent_ids = self.get_preset_agents(preset_name)
|
|
149
|
+
logger.debug(f"[DEBUG] Got agent IDs: {len(agent_ids)} agents")
|
|
150
|
+
|
|
151
|
+
result = {
|
|
152
|
+
"preset_info": preset_info,
|
|
153
|
+
"agents": [],
|
|
154
|
+
"missing_agents": [],
|
|
155
|
+
"conflicts": [],
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if not validate_availability:
|
|
159
|
+
# Return agent IDs without validation
|
|
160
|
+
logger.debug("[DEBUG] Skipping validation, returning agent IDs only")
|
|
161
|
+
result["agents"] = [{"agent_id": aid} for aid in agent_ids]
|
|
162
|
+
return result
|
|
163
|
+
|
|
164
|
+
# Get all cached agents from sources
|
|
165
|
+
logger.debug("[DEBUG] Calling source_manager.list_cached_agents()")
|
|
166
|
+
all_agents = self.source_manager.list_cached_agents()
|
|
167
|
+
logger.debug(f"[DEBUG] Got {len(all_agents)} agents from source manager")
|
|
168
|
+
|
|
169
|
+
# Build lookup: agent_id -> list of sources
|
|
170
|
+
# Each entry is (source_identifier, agent_data)
|
|
171
|
+
logger.debug("[DEBUG] Building agent_sources lookup table")
|
|
172
|
+
agent_sources: Dict[str, List[tuple]] = {}
|
|
173
|
+
for idx, agent in enumerate(all_agents):
|
|
174
|
+
if idx % 10 == 0:
|
|
175
|
+
logger.debug(f"[DEBUG] Processing agent {idx}/{len(all_agents)}")
|
|
176
|
+
# Handle both 'agent_id' and 'id' keys for compatibility
|
|
177
|
+
agent_id = agent.get("agent_id") or agent.get("id")
|
|
178
|
+
if not agent_id:
|
|
179
|
+
logger.warning(f"Agent missing agent_id field: {agent.keys()}")
|
|
180
|
+
continue
|
|
181
|
+
|
|
182
|
+
# Bug #5 fix: Handle both string and dict formats for 'source' field
|
|
183
|
+
# GitSourceManager sets source as string (repo_identifier)
|
|
184
|
+
# Some agents may have source as dict with 'identifier' key
|
|
185
|
+
source_value = agent.get("source", "unknown")
|
|
186
|
+
if isinstance(source_value, dict):
|
|
187
|
+
source = source_value.get("identifier", "unknown")
|
|
188
|
+
else:
|
|
189
|
+
source = source_value # Already a string
|
|
190
|
+
|
|
191
|
+
if agent_id not in agent_sources:
|
|
192
|
+
agent_sources[agent_id] = []
|
|
193
|
+
agent_sources[agent_id].append((source, agent))
|
|
194
|
+
|
|
195
|
+
logger.debug(
|
|
196
|
+
f"[DEBUG] Built lookup table with {len(agent_sources)} unique agents"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Resolve each agent in preset
|
|
200
|
+
logger.debug(f"[DEBUG] Resolving {len(agent_ids)} preset agents")
|
|
201
|
+
for idx, agent_id in enumerate(agent_ids):
|
|
202
|
+
logger.debug(
|
|
203
|
+
f"[DEBUG] Resolving agent {idx + 1}/{len(agent_ids)}: {agent_id}"
|
|
204
|
+
)
|
|
205
|
+
if agent_id not in agent_sources:
|
|
206
|
+
logger.debug(f"[DEBUG] Agent {agent_id} not found in sources (missing)")
|
|
207
|
+
result["missing_agents"].append(agent_id)
|
|
208
|
+
continue
|
|
209
|
+
|
|
210
|
+
sources = agent_sources[agent_id]
|
|
211
|
+
logger.debug(f"[DEBUG] Agent {agent_id} found in {len(sources)} source(s)")
|
|
212
|
+
|
|
213
|
+
# Conflict if agent found in multiple sources
|
|
214
|
+
if len(sources) > 1:
|
|
215
|
+
logger.debug(
|
|
216
|
+
f"[DEBUG] Agent {agent_id} has conflict (multiple sources)"
|
|
217
|
+
)
|
|
218
|
+
result["conflicts"].append(
|
|
219
|
+
{
|
|
220
|
+
"agent_id": agent_id,
|
|
221
|
+
"sources": [s[0] for s in sources],
|
|
222
|
+
}
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
# Use first source (highest priority)
|
|
226
|
+
source_name, agent_data = sources[0]
|
|
227
|
+
result["agents"].append(
|
|
228
|
+
{
|
|
229
|
+
"agent_id": agent_id,
|
|
230
|
+
"source": source_name,
|
|
231
|
+
"metadata": agent_data,
|
|
232
|
+
}
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
logger.debug(
|
|
236
|
+
f"[DEBUG] resolve_agents COMPLETE: {len(result['agents'])} resolved"
|
|
237
|
+
)
|
|
238
|
+
return result
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"""Agent Recommendation Service
|
|
2
|
+
|
|
3
|
+
WHY: Provides intelligent agent recommendations based on toolchain detection
|
|
4
|
+
and always-recommended core agents. Helps users discover and install the
|
|
5
|
+
most relevant agents for their project without manual selection.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISION: Uses toolchain analysis to map detected languages/frameworks
|
|
8
|
+
to specific engineer agents, plus always includes core agents.
|
|
9
|
+
|
|
10
|
+
Architecture:
|
|
11
|
+
- Toolchain-based recommendations: Python → python-engineer, etc.
|
|
12
|
+
- Core agents (always recommended): engineer, qa-agent, memory-manager-agent, local-ops-agent,
|
|
13
|
+
research-agent, documentation-agent, security-agent
|
|
14
|
+
- Confidence-based filtering: Only recommend high-confidence detections
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Dict, List, Optional, Set
|
|
19
|
+
|
|
20
|
+
from ...services.project.toolchain_analyzer import ToolchainAnalyzerService
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class AgentRecommendationService:
|
|
24
|
+
"""Service for recommending agents based on project toolchain.
|
|
25
|
+
|
|
26
|
+
WHY: Users shouldn't have to manually figure out which agents to install.
|
|
27
|
+
This service provides intelligent recommendations based on detected stack.
|
|
28
|
+
|
|
29
|
+
DESIGN DECISION: Separated from configure.py for reusability and testability.
|
|
30
|
+
Can be used by CLI, API, or future auto-configuration features.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
# Core agents always included - matches ToolchainDetector.CORE_AGENTS
|
|
34
|
+
# Uses exact agent IDs from repository for consistency
|
|
35
|
+
CORE_AGENTS = {
|
|
36
|
+
"engineer",
|
|
37
|
+
"qa-agent",
|
|
38
|
+
"memory-manager-agent",
|
|
39
|
+
"local-ops-agent",
|
|
40
|
+
"research-agent",
|
|
41
|
+
"documentation-agent",
|
|
42
|
+
"security-agent",
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# Map detected languages to recommended engineer agents
|
|
46
|
+
LANGUAGE_TO_AGENTS: Dict[str, List[str]] = {
|
|
47
|
+
"python": [
|
|
48
|
+
"engineer/backend/python-engineer",
|
|
49
|
+
"qa/api-qa",
|
|
50
|
+
],
|
|
51
|
+
"javascript": [
|
|
52
|
+
"engineer/backend/javascript-engineer",
|
|
53
|
+
"engineer/data/typescript-engineer",
|
|
54
|
+
],
|
|
55
|
+
"typescript": [
|
|
56
|
+
"engineer/data/typescript-engineer",
|
|
57
|
+
"engineer/backend/javascript-engineer",
|
|
58
|
+
],
|
|
59
|
+
"rust": [
|
|
60
|
+
"engineer/backend/rust-engineer",
|
|
61
|
+
],
|
|
62
|
+
"go": [
|
|
63
|
+
"engineer/backend/golang-engineer",
|
|
64
|
+
],
|
|
65
|
+
"java": [
|
|
66
|
+
"engineer/backend/java-engineer",
|
|
67
|
+
],
|
|
68
|
+
"dart": [
|
|
69
|
+
"engineer/mobile/dart-engineer",
|
|
70
|
+
],
|
|
71
|
+
"php": [
|
|
72
|
+
"engineer/backend/php-engineer",
|
|
73
|
+
],
|
|
74
|
+
"ruby": [
|
|
75
|
+
"engineer/backend/ruby-engineer",
|
|
76
|
+
],
|
|
77
|
+
"swift": [
|
|
78
|
+
"engineer/mobile/swift-engineer",
|
|
79
|
+
],
|
|
80
|
+
"kotlin": [
|
|
81
|
+
"engineer/mobile/kotlin-engineer",
|
|
82
|
+
],
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# Map detected frameworks to recommended agents
|
|
86
|
+
FRAMEWORK_TO_AGENTS: Dict[str, List[str]] = {
|
|
87
|
+
# Frontend frameworks
|
|
88
|
+
"react": [
|
|
89
|
+
"engineer/frontend/react-engineer",
|
|
90
|
+
"qa/web-qa",
|
|
91
|
+
],
|
|
92
|
+
"nextjs": [
|
|
93
|
+
"engineer/frontend/nextjs-engineer",
|
|
94
|
+
"engineer/frontend/react-engineer",
|
|
95
|
+
"ops/platform/vercel-ops",
|
|
96
|
+
],
|
|
97
|
+
"vue": [
|
|
98
|
+
"engineer/frontend/vue-engineer",
|
|
99
|
+
],
|
|
100
|
+
"angular": [
|
|
101
|
+
"engineer/frontend/angular-engineer",
|
|
102
|
+
],
|
|
103
|
+
# Backend frameworks
|
|
104
|
+
"fastapi": [
|
|
105
|
+
"engineer/backend/python-engineer",
|
|
106
|
+
"qa/api-qa",
|
|
107
|
+
],
|
|
108
|
+
"django": [
|
|
109
|
+
"engineer/backend/python-engineer",
|
|
110
|
+
"qa/api-qa",
|
|
111
|
+
],
|
|
112
|
+
"flask": [
|
|
113
|
+
"engineer/backend/python-engineer",
|
|
114
|
+
"qa/api-qa",
|
|
115
|
+
],
|
|
116
|
+
"express": [
|
|
117
|
+
"engineer/backend/javascript-engineer",
|
|
118
|
+
"qa/api-qa",
|
|
119
|
+
],
|
|
120
|
+
"nest": [
|
|
121
|
+
"engineer/backend/javascript-engineer",
|
|
122
|
+
"qa/api-qa",
|
|
123
|
+
],
|
|
124
|
+
# Mobile frameworks
|
|
125
|
+
"flutter": [
|
|
126
|
+
"engineer/mobile/dart-engineer",
|
|
127
|
+
],
|
|
128
|
+
"react-native": [
|
|
129
|
+
"engineer/frontend/react-engineer",
|
|
130
|
+
"engineer/mobile/react-native-engineer",
|
|
131
|
+
],
|
|
132
|
+
# Desktop frameworks
|
|
133
|
+
"tauri": [
|
|
134
|
+
"engineer/mobile/tauri-engineer",
|
|
135
|
+
"engineer/backend/rust-engineer",
|
|
136
|
+
],
|
|
137
|
+
"electron": [
|
|
138
|
+
"engineer/backend/javascript-engineer",
|
|
139
|
+
],
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
def __init__(self, toolchain_analyzer: Optional[ToolchainAnalyzerService] = None):
|
|
143
|
+
"""Initialize agent recommendation service.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
toolchain_analyzer: Optional pre-initialized toolchain analyzer.
|
|
147
|
+
If None, creates a new instance.
|
|
148
|
+
"""
|
|
149
|
+
self.toolchain_analyzer = toolchain_analyzer or ToolchainAnalyzerService()
|
|
150
|
+
|
|
151
|
+
def get_recommended_agents(
|
|
152
|
+
self,
|
|
153
|
+
project_path: Optional[str] = None,
|
|
154
|
+
confidence_threshold: float = 0.5,
|
|
155
|
+
) -> Set[str]:
|
|
156
|
+
"""Get recommended agents for a project.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
project_path: Path to project directory. Defaults to cwd.
|
|
160
|
+
confidence_threshold: Minimum confidence for recommendations (0.0-1.0).
|
|
161
|
+
Only include detected components above this threshold.
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
Set of recommended agent IDs (e.g., {"qa-agent", "research-agent", ...})
|
|
165
|
+
|
|
166
|
+
Example:
|
|
167
|
+
>>> service = AgentRecommendationService()
|
|
168
|
+
>>> recommended = service.get_recommended_agents()
|
|
169
|
+
>>> "qa-agent" in recommended
|
|
170
|
+
True
|
|
171
|
+
>>> # For Python project:
|
|
172
|
+
>>> "engineer/backend/python-engineer" in recommended
|
|
173
|
+
True
|
|
174
|
+
"""
|
|
175
|
+
# Start with core agents (always recommended)
|
|
176
|
+
recommended = self.CORE_AGENTS.copy()
|
|
177
|
+
|
|
178
|
+
# Analyze project toolchain
|
|
179
|
+
if project_path is None:
|
|
180
|
+
project_path = str(Path.cwd())
|
|
181
|
+
|
|
182
|
+
try:
|
|
183
|
+
# ToolchainAnalyzerService.analyze_toolchain takes Path, not str
|
|
184
|
+
analysis = self.toolchain_analyzer.analyze_toolchain(Path(project_path))
|
|
185
|
+
except Exception as e:
|
|
186
|
+
# If analysis fails, just return core agents
|
|
187
|
+
print(f"Warning: Toolchain analysis failed: {e}")
|
|
188
|
+
return recommended
|
|
189
|
+
|
|
190
|
+
# Add language-specific agents
|
|
191
|
+
# ToolchainAnalysis has a single LanguageDetection object, not a list
|
|
192
|
+
if analysis.language_detection:
|
|
193
|
+
# Check primary language
|
|
194
|
+
primary_lang = analysis.language_detection.primary_language.lower()
|
|
195
|
+
if primary_lang in self.LANGUAGE_TO_AGENTS:
|
|
196
|
+
recommended.update(self.LANGUAGE_TO_AGENTS[primary_lang])
|
|
197
|
+
|
|
198
|
+
# Check secondary languages
|
|
199
|
+
for lang_component in analysis.language_detection.secondary_languages:
|
|
200
|
+
lang = lang_component.name.lower()
|
|
201
|
+
if lang in self.LANGUAGE_TO_AGENTS:
|
|
202
|
+
recommended.update(self.LANGUAGE_TO_AGENTS[lang])
|
|
203
|
+
|
|
204
|
+
# Add framework-specific agents
|
|
205
|
+
for framework in analysis.frameworks:
|
|
206
|
+
fw_name = framework.name.lower()
|
|
207
|
+
if fw_name in self.FRAMEWORK_TO_AGENTS:
|
|
208
|
+
recommended.update(self.FRAMEWORK_TO_AGENTS[fw_name])
|
|
209
|
+
|
|
210
|
+
return recommended
|
|
211
|
+
|
|
212
|
+
def get_detection_summary(self, project_path: Optional[str] = None) -> Dict:
|
|
213
|
+
"""Get human-readable summary of detected toolchain.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
project_path: Path to project directory. Defaults to cwd.
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
Dict with keys:
|
|
220
|
+
- detected_languages: List of detected language names
|
|
221
|
+
- detected_frameworks: List of detected framework names
|
|
222
|
+
- recommended_count: Number of recommended agents
|
|
223
|
+
- detection_quality: "high", "medium", "low", or "none"
|
|
224
|
+
|
|
225
|
+
Example:
|
|
226
|
+
>>> summary = service.get_detection_summary()
|
|
227
|
+
>>> summary['detected_languages']
|
|
228
|
+
['Python', 'JavaScript']
|
|
229
|
+
>>> summary['recommended_count']
|
|
230
|
+
15
|
|
231
|
+
"""
|
|
232
|
+
if project_path is None:
|
|
233
|
+
project_path = str(Path.cwd())
|
|
234
|
+
|
|
235
|
+
try:
|
|
236
|
+
analysis = self.toolchain_analyzer.analyze_toolchain(Path(project_path))
|
|
237
|
+
|
|
238
|
+
# Extract languages from LanguageDetection object
|
|
239
|
+
languages = []
|
|
240
|
+
if analysis.language_detection:
|
|
241
|
+
languages.append(analysis.language_detection.primary_language)
|
|
242
|
+
languages.extend(
|
|
243
|
+
comp.name
|
|
244
|
+
for comp in analysis.language_detection.secondary_languages
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
# Extract frameworks
|
|
248
|
+
frameworks = [fw.name for fw in analysis.frameworks]
|
|
249
|
+
|
|
250
|
+
# Get recommended agents
|
|
251
|
+
recommended = self.get_recommended_agents(project_path)
|
|
252
|
+
|
|
253
|
+
# Determine detection quality from overall_confidence
|
|
254
|
+
confidence_map = {
|
|
255
|
+
"high": "high",
|
|
256
|
+
"medium": "medium",
|
|
257
|
+
"low": "low",
|
|
258
|
+
"very_low": "low",
|
|
259
|
+
}
|
|
260
|
+
quality = confidence_map.get(
|
|
261
|
+
str(analysis.overall_confidence).lower(), "unknown"
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
return {
|
|
265
|
+
"detected_languages": languages,
|
|
266
|
+
"detected_frameworks": frameworks,
|
|
267
|
+
"recommended_count": len(recommended),
|
|
268
|
+
"detection_quality": quality,
|
|
269
|
+
}
|
|
270
|
+
except Exception as e:
|
|
271
|
+
# Log the error for debugging
|
|
272
|
+
print(f"Warning: Toolchain analysis failed: {e}")
|
|
273
|
+
return {
|
|
274
|
+
"detected_languages": [],
|
|
275
|
+
"detected_frameworks": [],
|
|
276
|
+
"recommended_count": len(self.CORE_AGENTS),
|
|
277
|
+
"detection_quality": "none",
|
|
278
|
+
}
|