claude-mpm 4.21.3__py3-none-any.whl → 5.0.2__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +38 -2
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +125 -20
- claude_mpm/cli/commands/agents.py +684 -13
- 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 +2 -6
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +478 -44
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +50 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +435 -1
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +919 -41
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +173 -4
- claude_mpm/cli/parsers/base_parser.py +49 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +138 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +499 -84
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +11 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +258 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +12 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +17 -10
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +112 -5
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +94 -4
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1055 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +92 -1
- 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 +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/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/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -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 +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +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/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- 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/tools/code_tree_analyzer/analysis.py +1 -1
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/progress.py +383 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +252 -425
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -180
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -211
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -140
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/ticketing.json +0 -177
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -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/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.21.3.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
"""Auto-Deploy Index Parser for agent categorization and filtering.
|
|
2
|
+
|
|
3
|
+
WHY: This module parses AUTO-DEPLOY-INDEX.md to extract category mappings,
|
|
4
|
+
language/framework detection rules, and agent relationships. This enables
|
|
5
|
+
rich filtering and discovery of agents from configured sources.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISION: Parse at runtime, cache results for performance
|
|
8
|
+
|
|
9
|
+
Rationale: AUTO-DEPLOY-INDEX.md is the single source of truth for agent
|
|
10
|
+
categorization. Parsing at runtime allows updates without code changes,
|
|
11
|
+
and caching ensures performance isn't impacted by repeated parsing.
|
|
12
|
+
|
|
13
|
+
Trade-offs:
|
|
14
|
+
- Performance: Cache provides ~O(1) lookups after initial parse (~50ms)
|
|
15
|
+
- Flexibility: Changes to AUTO-DEPLOY-INDEX.md don't require code deployment
|
|
16
|
+
- Complexity: Parser must handle variations in markdown format gracefully
|
|
17
|
+
|
|
18
|
+
Example:
|
|
19
|
+
>>> parser = AutoDeployIndexParser(index_path)
|
|
20
|
+
>>> categories = parser.get_categories()
|
|
21
|
+
>>> ['universal', 'engineer/backend', 'engineer/frontend', ...]
|
|
22
|
+
|
|
23
|
+
>>> agents = parser.get_agents_by_language('python')
|
|
24
|
+
>>> {'core': ['engineer/backend/python-engineer', ...], 'optional': [...]}
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
import logging
|
|
28
|
+
import re
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
from typing import Any, Dict, List, Optional
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class AutoDeployIndexParser:
|
|
36
|
+
"""Parser for AUTO-DEPLOY-INDEX.md agent categorization.
|
|
37
|
+
|
|
38
|
+
This service parses the AUTO-DEPLOY-INDEX.md markdown file to extract:
|
|
39
|
+
- Universal agents (always deployed)
|
|
40
|
+
- Language-specific detection rules and agents
|
|
41
|
+
- Framework-specific detection rules and agents
|
|
42
|
+
- Platform-specific detection rules and agents
|
|
43
|
+
- Specialized detection rules and agents
|
|
44
|
+
|
|
45
|
+
Design Decision: Regex-based Markdown Parsing
|
|
46
|
+
|
|
47
|
+
Rationale: AUTO-DEPLOY-INDEX.md has consistent structure using markdown
|
|
48
|
+
headers and bullet lists. Regex parsing is sufficient and avoids adding
|
|
49
|
+
a markdown parsing library dependency.
|
|
50
|
+
|
|
51
|
+
Trade-offs:
|
|
52
|
+
- Simplicity: No external dependencies, straightforward patterns
|
|
53
|
+
- Fragility: Changes to markdown structure may require parser updates
|
|
54
|
+
- Performance: Regex is fast for this file size (~400 lines)
|
|
55
|
+
|
|
56
|
+
Error Handling:
|
|
57
|
+
- Graceful degradation: Returns empty results if file missing or malformed
|
|
58
|
+
- Logging: Warns about parsing issues for debugging
|
|
59
|
+
- No exceptions: Parser never crashes, always returns valid (possibly empty) data
|
|
60
|
+
|
|
61
|
+
Caching:
|
|
62
|
+
- Parse results cached in instance after first parse
|
|
63
|
+
- Cache invalidated only by creating new instance
|
|
64
|
+
- For long-running processes, recreate parser periodically
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
def __init__(self, index_file_path: Path):
|
|
68
|
+
"""Initialize parser with path to AUTO-DEPLOY-INDEX.md.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
index_file_path: Path to AUTO-DEPLOY-INDEX.md file
|
|
72
|
+
"""
|
|
73
|
+
self.index_file_path = Path(index_file_path)
|
|
74
|
+
self._cache: Optional[Dict[str, Any]] = None
|
|
75
|
+
self._content: Optional[str] = None
|
|
76
|
+
|
|
77
|
+
logger.debug(f"AutoDeployIndexParser initialized with: {self.index_file_path}")
|
|
78
|
+
|
|
79
|
+
def parse(self) -> Dict[str, Any]:
|
|
80
|
+
"""Parse AUTO-DEPLOY-INDEX.md and return structured data.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Dictionary with structure:
|
|
84
|
+
{
|
|
85
|
+
"universal_agents": List[str],
|
|
86
|
+
"language_mappings": Dict[str, Dict[str, List[str]]], # lang -> {core, optional}
|
|
87
|
+
"framework_mappings": Dict[str, List[str]], # framework -> agents
|
|
88
|
+
"platform_mappings": Dict[str, List[str]], # platform -> agents
|
|
89
|
+
"specialization_mappings": Dict[str, List[str]] # spec -> agents
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
Example:
|
|
93
|
+
>>> result = parser.parse()
|
|
94
|
+
>>> result['universal_agents']
|
|
95
|
+
['universal/memory-manager', 'universal/research', ...]
|
|
96
|
+
|
|
97
|
+
>>> result['language_mappings']['python']
|
|
98
|
+
{
|
|
99
|
+
'core': ['engineer/backend/python-engineer', 'qa/qa', ...],
|
|
100
|
+
'optional': ['engineer/backend/data-engineer']
|
|
101
|
+
}
|
|
102
|
+
"""
|
|
103
|
+
if self._cache is not None:
|
|
104
|
+
return self._cache
|
|
105
|
+
|
|
106
|
+
# Load file content
|
|
107
|
+
if not self.index_file_path.exists():
|
|
108
|
+
logger.warning(f"AUTO-DEPLOY-INDEX.md not found at: {self.index_file_path}")
|
|
109
|
+
return self._empty_result()
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
self._content = self.index_file_path.read_text(encoding="utf-8")
|
|
113
|
+
except Exception as e:
|
|
114
|
+
logger.error(f"Failed to read AUTO-DEPLOY-INDEX.md: {e}")
|
|
115
|
+
return self._empty_result()
|
|
116
|
+
|
|
117
|
+
# Parse sections
|
|
118
|
+
result = {
|
|
119
|
+
"universal_agents": self._parse_universal_agents(),
|
|
120
|
+
"language_mappings": self._parse_language_mappings(),
|
|
121
|
+
"framework_mappings": self._parse_framework_mappings(),
|
|
122
|
+
"platform_mappings": self._parse_platform_mappings(),
|
|
123
|
+
"specialization_mappings": self._parse_specialization_mappings(),
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
self._cache = result
|
|
127
|
+
logger.info(
|
|
128
|
+
f"Parsed AUTO-DEPLOY-INDEX.md: "
|
|
129
|
+
f"{len(result['universal_agents'])} universal agents, "
|
|
130
|
+
f"{len(result['language_mappings'])} languages, "
|
|
131
|
+
f"{len(result['framework_mappings'])} frameworks, "
|
|
132
|
+
f"{len(result['platform_mappings'])} platforms"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
return result
|
|
136
|
+
|
|
137
|
+
def _empty_result(self) -> Dict[str, Any]:
|
|
138
|
+
"""Return empty result structure when parsing fails."""
|
|
139
|
+
return {
|
|
140
|
+
"universal_agents": [],
|
|
141
|
+
"language_mappings": {},
|
|
142
|
+
"framework_mappings": {},
|
|
143
|
+
"platform_mappings": {},
|
|
144
|
+
"specialization_mappings": {},
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
def _parse_universal_agents(self) -> List[str]:
|
|
148
|
+
"""Extract universal agents (always deployed).
|
|
149
|
+
|
|
150
|
+
Looks for the "Universal Agents (Always Deployed)" section
|
|
151
|
+
and extracts agent IDs from bullet points.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
List of agent IDs (e.g., ['universal/memory-manager', ...])
|
|
155
|
+
"""
|
|
156
|
+
if not self._content:
|
|
157
|
+
return []
|
|
158
|
+
|
|
159
|
+
agents = []
|
|
160
|
+
|
|
161
|
+
# Find Universal Agents section
|
|
162
|
+
universal_section = re.search(
|
|
163
|
+
r"## Universal Agents \(Always Deployed\)(.*?)(?=##|\Z)",
|
|
164
|
+
self._content,
|
|
165
|
+
re.DOTALL,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
if not universal_section:
|
|
169
|
+
return agents
|
|
170
|
+
|
|
171
|
+
section_text = universal_section.group(1)
|
|
172
|
+
|
|
173
|
+
# Extract agent IDs from backticks (e.g., `universal/memory-manager`)
|
|
174
|
+
agent_pattern = r"`([a-z0-9\-/]+/[a-z0-9\-]+)`"
|
|
175
|
+
matches = re.findall(agent_pattern, section_text)
|
|
176
|
+
agents.extend(matches)
|
|
177
|
+
|
|
178
|
+
logger.debug(f"Found {len(agents)} universal agents")
|
|
179
|
+
return agents
|
|
180
|
+
|
|
181
|
+
def _parse_language_mappings(self) -> Dict[str, Dict[str, List[str]]]:
|
|
182
|
+
"""Extract language-specific agent mappings.
|
|
183
|
+
|
|
184
|
+
Parses sections like "### Python Projects" to extract:
|
|
185
|
+
- Indicator files (for detection)
|
|
186
|
+
- Auto-deploy agents (core)
|
|
187
|
+
- Optional agents (conditional)
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
Dict mapping language name to {core: [...], optional: [...]}
|
|
191
|
+
"""
|
|
192
|
+
if not self._content:
|
|
193
|
+
return {}
|
|
194
|
+
|
|
195
|
+
mappings = {}
|
|
196
|
+
|
|
197
|
+
# Find Project Type Detection section
|
|
198
|
+
detection_section = re.search(
|
|
199
|
+
r"## Project Type Detection(.*?)(?=## Platform-Specific Detection|\Z)",
|
|
200
|
+
self._content,
|
|
201
|
+
re.DOTALL,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
if not detection_section:
|
|
205
|
+
return mappings
|
|
206
|
+
|
|
207
|
+
section_text = detection_section.group(1)
|
|
208
|
+
|
|
209
|
+
# Find all language subsections (### Python Projects, ### JavaScript/TypeScript Projects, etc.)
|
|
210
|
+
language_sections = re.finditer(
|
|
211
|
+
r"### ([A-Za-z/]+) Projects\n+(.*?)(?=###|\Z)", section_text, re.DOTALL
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
for match in language_sections:
|
|
215
|
+
lang_name = match.group(1).strip()
|
|
216
|
+
lang_content = match.group(2)
|
|
217
|
+
|
|
218
|
+
# Extract language key (lowercase, first word)
|
|
219
|
+
lang_key = lang_name.split("/")[0].lower()
|
|
220
|
+
|
|
221
|
+
# Extract auto-deploy agents
|
|
222
|
+
core_agents = self._extract_agents_from_section(
|
|
223
|
+
lang_content, "Auto-Deploy Agents"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Extract optional agents
|
|
227
|
+
optional_agents = self._extract_agents_from_section(
|
|
228
|
+
lang_content, "Optional Agents"
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
if core_agents or optional_agents:
|
|
232
|
+
mappings[lang_key] = {"core": core_agents, "optional": optional_agents}
|
|
233
|
+
logger.debug(
|
|
234
|
+
f"Language '{lang_key}': {len(core_agents)} core, {len(optional_agents)} optional agents"
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
return mappings
|
|
238
|
+
|
|
239
|
+
def _parse_framework_mappings(self) -> Dict[str, List[str]]:
|
|
240
|
+
"""Extract framework-specific agent mappings.
|
|
241
|
+
|
|
242
|
+
Parses conditional deployment sections like "#### React Projects"
|
|
243
|
+
within JavaScript/TypeScript sections.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Dict mapping framework name to list of agent IDs
|
|
247
|
+
"""
|
|
248
|
+
if not self._content:
|
|
249
|
+
return {}
|
|
250
|
+
|
|
251
|
+
mappings = {}
|
|
252
|
+
|
|
253
|
+
# Find JavaScript/TypeScript section (contains framework mappings)
|
|
254
|
+
js_section = re.search(
|
|
255
|
+
r"### JavaScript/TypeScript Projects(.*?)(?=###|\Z)",
|
|
256
|
+
self._content,
|
|
257
|
+
re.DOTALL,
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
if not js_section:
|
|
261
|
+
return mappings
|
|
262
|
+
|
|
263
|
+
js_content = js_section.group(1)
|
|
264
|
+
|
|
265
|
+
# Find framework subsections (#### React Projects, etc.)
|
|
266
|
+
framework_sections = re.finditer(
|
|
267
|
+
r"#### ([A-Za-z./]+)(?: Projects)?\n+(.*?)(?=####|\n\n###|\Z)",
|
|
268
|
+
js_content,
|
|
269
|
+
re.DOTALL,
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
for match in framework_sections:
|
|
273
|
+
framework_name = match.group(1).strip()
|
|
274
|
+
framework_content = match.group(2)
|
|
275
|
+
|
|
276
|
+
# Extract framework key (lowercase)
|
|
277
|
+
framework_key = framework_name.lower().replace(" ", "-")
|
|
278
|
+
|
|
279
|
+
# Extract agent IDs from lines starting with `-`
|
|
280
|
+
agents = self._extract_agent_ids(framework_content)
|
|
281
|
+
|
|
282
|
+
if agents:
|
|
283
|
+
mappings[framework_key] = agents
|
|
284
|
+
logger.debug(f"Framework '{framework_key}': {len(agents)} agents")
|
|
285
|
+
|
|
286
|
+
return mappings
|
|
287
|
+
|
|
288
|
+
def _parse_platform_mappings(self) -> Dict[str, List[str]]:
|
|
289
|
+
"""Extract platform-specific agent mappings.
|
|
290
|
+
|
|
291
|
+
Parses "## Platform-Specific Detection" section to extract
|
|
292
|
+
deployment platform agents (Vercel, GCP, Docker, etc.).
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
Dict mapping platform name to list of agent IDs
|
|
296
|
+
"""
|
|
297
|
+
if not self._content:
|
|
298
|
+
return {}
|
|
299
|
+
|
|
300
|
+
mappings = {}
|
|
301
|
+
|
|
302
|
+
# Find Platform-Specific Detection section
|
|
303
|
+
platform_section = re.search(
|
|
304
|
+
r"## Platform-Specific Detection(.*?)(?=##|\Z)", self._content, re.DOTALL
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
if not platform_section:
|
|
308
|
+
return mappings
|
|
309
|
+
|
|
310
|
+
section_text = platform_section.group(1)
|
|
311
|
+
|
|
312
|
+
# Find platform subsections (### Vercel, ### Google Cloud Platform, etc.)
|
|
313
|
+
platform_subsections = re.finditer(
|
|
314
|
+
r"### ([A-Za-z0-9 ./()]+)\n+(.*?)(?=###|\Z)", section_text, re.DOTALL
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
for match in platform_subsections:
|
|
318
|
+
platform_name = match.group(1).strip()
|
|
319
|
+
platform_content = match.group(2)
|
|
320
|
+
|
|
321
|
+
# Extract platform key (lowercase, simplified)
|
|
322
|
+
platform_key = platform_name.lower().replace(" ", "-")
|
|
323
|
+
|
|
324
|
+
# Special case mappings
|
|
325
|
+
if "google cloud" in platform_key:
|
|
326
|
+
platform_key = "gcp"
|
|
327
|
+
elif "docker" in platform_key or "container" in platform_key:
|
|
328
|
+
platform_key = "docker"
|
|
329
|
+
|
|
330
|
+
# Extract agent IDs
|
|
331
|
+
agents = self._extract_agent_ids(platform_content)
|
|
332
|
+
|
|
333
|
+
if agents:
|
|
334
|
+
mappings[platform_key] = agents
|
|
335
|
+
logger.debug(f"Platform '{platform_key}': {len(agents)} agents")
|
|
336
|
+
|
|
337
|
+
return mappings
|
|
338
|
+
|
|
339
|
+
def _parse_specialization_mappings(self) -> Dict[str, List[str]]:
|
|
340
|
+
"""Extract specialization-specific agent mappings.
|
|
341
|
+
|
|
342
|
+
Parses "## Specialized Detection" section to extract agents
|
|
343
|
+
for data engineering, image processing, build optimization, etc.
|
|
344
|
+
|
|
345
|
+
Returns:
|
|
346
|
+
Dict mapping specialization name to list of agent IDs
|
|
347
|
+
"""
|
|
348
|
+
if not self._content:
|
|
349
|
+
return {}
|
|
350
|
+
|
|
351
|
+
mappings = {}
|
|
352
|
+
|
|
353
|
+
# Find Specialized Detection section
|
|
354
|
+
specialized_section = re.search(
|
|
355
|
+
r"## Specialized Detection(.*?)(?=##|\Z)", self._content, re.DOTALL
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
if not specialized_section:
|
|
359
|
+
return mappings
|
|
360
|
+
|
|
361
|
+
section_text = specialized_section.group(1)
|
|
362
|
+
|
|
363
|
+
# Find specialization subsections
|
|
364
|
+
spec_subsections = re.finditer(
|
|
365
|
+
r"### ([A-Za-z0-9 ]+)\n+(.*?)(?=###|\Z)", section_text, re.DOTALL
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
for match in spec_subsections:
|
|
369
|
+
spec_name = match.group(1).strip()
|
|
370
|
+
spec_content = match.group(2)
|
|
371
|
+
|
|
372
|
+
# Extract specialization key (lowercase, simplified)
|
|
373
|
+
spec_key = spec_name.lower().replace(" ", "-")
|
|
374
|
+
|
|
375
|
+
# Extract agent IDs
|
|
376
|
+
agents = self._extract_agent_ids(spec_content)
|
|
377
|
+
|
|
378
|
+
if agents:
|
|
379
|
+
mappings[spec_key] = agents
|
|
380
|
+
logger.debug(f"Specialization '{spec_key}': {len(agents)} agents")
|
|
381
|
+
|
|
382
|
+
return mappings
|
|
383
|
+
|
|
384
|
+
def _extract_agents_from_section(
|
|
385
|
+
self, content: str, section_name: str
|
|
386
|
+
) -> List[str]:
|
|
387
|
+
"""Extract agent IDs from a named section within content.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
content: Text content to search
|
|
391
|
+
section_name: Name of section (e.g., "Auto-Deploy Agents")
|
|
392
|
+
|
|
393
|
+
Returns:
|
|
394
|
+
List of agent IDs found in section
|
|
395
|
+
"""
|
|
396
|
+
# Find section by name
|
|
397
|
+
section_match = re.search(
|
|
398
|
+
rf"\*\*{re.escape(section_name)}\*\*:(.*?)(?=\n\*\*|\Z)", content, re.DOTALL
|
|
399
|
+
)
|
|
400
|
+
|
|
401
|
+
if not section_match:
|
|
402
|
+
return []
|
|
403
|
+
|
|
404
|
+
section_text = section_match.group(1)
|
|
405
|
+
return self._extract_agent_ids(section_text)
|
|
406
|
+
|
|
407
|
+
def _extract_agent_ids(self, content: str) -> List[str]:
|
|
408
|
+
"""Extract agent IDs from content (looks for backtick-wrapped IDs).
|
|
409
|
+
|
|
410
|
+
Args:
|
|
411
|
+
content: Text content to search
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
List of agent IDs (e.g., ['engineer/backend/python-engineer', ...])
|
|
415
|
+
"""
|
|
416
|
+
agent_pattern = r"`([a-z0-9\-]+/[a-z0-9\-/]+)`"
|
|
417
|
+
return re.findall(agent_pattern, content)
|
|
418
|
+
|
|
419
|
+
def get_categories(self) -> List[str]:
|
|
420
|
+
"""Get all available agent categories.
|
|
421
|
+
|
|
422
|
+
Categories are derived from agent IDs by extracting the path prefix.
|
|
423
|
+
For example: 'engineer/backend/python-engineer' -> 'engineer/backend'
|
|
424
|
+
|
|
425
|
+
Returns:
|
|
426
|
+
List of category strings
|
|
427
|
+
|
|
428
|
+
Example:
|
|
429
|
+
>>> parser.get_categories()
|
|
430
|
+
['universal', 'documentation', 'engineer/backend', 'engineer/frontend',
|
|
431
|
+
'qa', 'ops/core', 'ops/platform', 'security']
|
|
432
|
+
"""
|
|
433
|
+
data = self.parse()
|
|
434
|
+
categories = set()
|
|
435
|
+
|
|
436
|
+
# Extract categories from all agent IDs
|
|
437
|
+
all_agents = []
|
|
438
|
+
all_agents.extend(data["universal_agents"])
|
|
439
|
+
|
|
440
|
+
for lang_data in data["language_mappings"].values():
|
|
441
|
+
all_agents.extend(lang_data["core"])
|
|
442
|
+
all_agents.extend(lang_data["optional"])
|
|
443
|
+
|
|
444
|
+
for agents in data["framework_mappings"].values():
|
|
445
|
+
all_agents.extend(agents)
|
|
446
|
+
|
|
447
|
+
for agents in data["platform_mappings"].values():
|
|
448
|
+
all_agents.extend(agents)
|
|
449
|
+
|
|
450
|
+
for agents in data["specialization_mappings"].values():
|
|
451
|
+
all_agents.extend(agents)
|
|
452
|
+
|
|
453
|
+
# Extract category from each agent ID
|
|
454
|
+
for agent_id in all_agents:
|
|
455
|
+
# Extract everything before the last '/'
|
|
456
|
+
if "/" in agent_id:
|
|
457
|
+
parts = agent_id.rsplit("/", 1)
|
|
458
|
+
categories.add(parts[0])
|
|
459
|
+
|
|
460
|
+
return sorted(categories)
|
|
461
|
+
|
|
462
|
+
def get_agents_by_category(self, category: str) -> List[str]:
|
|
463
|
+
"""Get all agents matching a specific category.
|
|
464
|
+
|
|
465
|
+
Args:
|
|
466
|
+
category: Category string (e.g., 'engineer/backend', 'qa')
|
|
467
|
+
|
|
468
|
+
Returns:
|
|
469
|
+
List of agent IDs matching category
|
|
470
|
+
|
|
471
|
+
Example:
|
|
472
|
+
>>> parser.get_agents_by_category('engineer/backend')
|
|
473
|
+
['engineer/backend/python-engineer', 'engineer/backend/rust-engineer', ...]
|
|
474
|
+
"""
|
|
475
|
+
data = self.parse()
|
|
476
|
+
matching_agents = []
|
|
477
|
+
|
|
478
|
+
# Collect all agents
|
|
479
|
+
all_agents = []
|
|
480
|
+
all_agents.extend(data["universal_agents"])
|
|
481
|
+
|
|
482
|
+
for lang_data in data["language_mappings"].values():
|
|
483
|
+
all_agents.extend(lang_data["core"])
|
|
484
|
+
all_agents.extend(lang_data["optional"])
|
|
485
|
+
|
|
486
|
+
for agents in data["framework_mappings"].values():
|
|
487
|
+
all_agents.extend(agents)
|
|
488
|
+
|
|
489
|
+
for agents in data["platform_mappings"].values():
|
|
490
|
+
all_agents.extend(agents)
|
|
491
|
+
|
|
492
|
+
for agents in data["specialization_mappings"].values():
|
|
493
|
+
all_agents.extend(agents)
|
|
494
|
+
|
|
495
|
+
# Filter by category
|
|
496
|
+
for agent_id in all_agents:
|
|
497
|
+
if agent_id.startswith(category + "/") or agent_id == category:
|
|
498
|
+
matching_agents.append(agent_id)
|
|
499
|
+
|
|
500
|
+
return sorted(set(matching_agents))
|
|
501
|
+
|
|
502
|
+
def get_agents_by_language(self, language: str) -> Dict[str, List[str]]:
|
|
503
|
+
"""Get core and optional agents for a specific language.
|
|
504
|
+
|
|
505
|
+
Args:
|
|
506
|
+
language: Language key (e.g., 'python', 'javascript', 'rust')
|
|
507
|
+
|
|
508
|
+
Returns:
|
|
509
|
+
Dictionary with 'core' and 'optional' agent lists
|
|
510
|
+
|
|
511
|
+
Example:
|
|
512
|
+
>>> parser.get_agents_by_language('python')
|
|
513
|
+
{
|
|
514
|
+
'core': ['engineer/backend/python-engineer', 'qa/qa', 'ops/core/ops', 'security/security'],
|
|
515
|
+
'optional': ['engineer/backend/data-engineer']
|
|
516
|
+
}
|
|
517
|
+
"""
|
|
518
|
+
data = self.parse()
|
|
519
|
+
return data["language_mappings"].get(
|
|
520
|
+
language.lower(), {"core": [], "optional": []}
|
|
521
|
+
)
|
|
522
|
+
|
|
523
|
+
def get_agents_by_framework(self, framework: str) -> List[str]:
|
|
524
|
+
"""Get agents for a specific framework.
|
|
525
|
+
|
|
526
|
+
Args:
|
|
527
|
+
framework: Framework key (e.g., 'react', 'nextjs', 'svelte')
|
|
528
|
+
|
|
529
|
+
Returns:
|
|
530
|
+
List of agent IDs for framework
|
|
531
|
+
|
|
532
|
+
Example:
|
|
533
|
+
>>> parser.get_agents_by_framework('react')
|
|
534
|
+
['engineer/frontend/react-engineer', 'qa/web-qa']
|
|
535
|
+
"""
|
|
536
|
+
data = self.parse()
|
|
537
|
+
return data["framework_mappings"].get(framework.lower(), [])
|
|
538
|
+
|
|
539
|
+
def get_agents_by_platform(self, platform: str) -> List[str]:
|
|
540
|
+
"""Get agents for a specific platform.
|
|
541
|
+
|
|
542
|
+
Args:
|
|
543
|
+
platform: Platform key (e.g., 'vercel', 'gcp', 'docker')
|
|
544
|
+
|
|
545
|
+
Returns:
|
|
546
|
+
List of agent IDs for platform
|
|
547
|
+
|
|
548
|
+
Example:
|
|
549
|
+
>>> parser.get_agents_by_platform('vercel')
|
|
550
|
+
['ops/platform/vercel-ops']
|
|
551
|
+
"""
|
|
552
|
+
data = self.parse()
|
|
553
|
+
return data["platform_mappings"].get(platform.lower(), [])
|
|
554
|
+
|
|
555
|
+
def get_agents_by_specialization(self, specialization: str) -> List[str]:
|
|
556
|
+
"""Get agents for a specific specialization.
|
|
557
|
+
|
|
558
|
+
Args:
|
|
559
|
+
specialization: Specialization key (e.g., 'data-engineering', 'image-processing')
|
|
560
|
+
|
|
561
|
+
Returns:
|
|
562
|
+
List of agent IDs for specialization
|
|
563
|
+
|
|
564
|
+
Example:
|
|
565
|
+
>>> parser.get_agents_by_specialization('data-engineering')
|
|
566
|
+
['engineer/data/data-engineer']
|
|
567
|
+
"""
|
|
568
|
+
data = self.parse()
|
|
569
|
+
return data["specialization_mappings"].get(specialization.lower(), [])
|