claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +35 -6
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/circuit-breakers.md +1254 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +188 -30
- claude_mpm/cli/commands/agents.py +959 -36
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +537 -239
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +924 -45
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +67 -1
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +125 -167
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +835 -44
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +1032 -47
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +256 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +53 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +145 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +564 -108
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +17 -2
- claude_mpm/commands/mpm-init.md +28 -3
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +11 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +19 -35
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +131 -10
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +110 -8
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +36 -16
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +200 -6
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/core/models/agent_config.py +3 -0
- claude_mpm/services/core/models/process.py +4 -0
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/diagnostics/models.py +21 -0
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +5 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +29 -9
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +3 -3
- claude_mpm/skills/agent_skills_injector.py +42 -49
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
- claude_mpm/skills/skills_registry.py +44 -48
- claude_mpm/skills/skills_service.py +117 -108
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -180
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -211
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -281
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -140
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/ticketing.json +0 -177
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/mpm_init.py +0 -2093
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
- claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
|
@@ -64,10 +64,12 @@ def parse_evaluation_file(file_path: Path) -> list[dict[str, Any]]:
|
|
|
64
64
|
answer_elem = qa_pair.find("answer")
|
|
65
65
|
|
|
66
66
|
if question_elem is not None and answer_elem is not None:
|
|
67
|
-
evaluations.append(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
evaluations.append(
|
|
68
|
+
{
|
|
69
|
+
"question": (question_elem.text or "").strip(),
|
|
70
|
+
"answer": (answer_elem.text or "").strip(),
|
|
71
|
+
}
|
|
72
|
+
)
|
|
71
73
|
|
|
72
74
|
return evaluations
|
|
73
75
|
except Exception as e:
|
|
@@ -113,7 +115,11 @@ async def agent_loop(
|
|
|
113
115
|
tool_start_ts = time.time()
|
|
114
116
|
try:
|
|
115
117
|
tool_result = await connection.call_tool(tool_name, tool_input)
|
|
116
|
-
tool_response =
|
|
118
|
+
tool_response = (
|
|
119
|
+
json.dumps(tool_result)
|
|
120
|
+
if isinstance(tool_result, (dict, list))
|
|
121
|
+
else str(tool_result)
|
|
122
|
+
)
|
|
117
123
|
except Exception as e:
|
|
118
124
|
tool_response = f"Error executing tool {tool_name}: {e!s}\n"
|
|
119
125
|
tool_response += traceback.format_exc()
|
|
@@ -124,14 +130,18 @@ async def agent_loop(
|
|
|
124
130
|
tool_metrics[tool_name]["count"] += 1
|
|
125
131
|
tool_metrics[tool_name]["durations"].append(tool_duration)
|
|
126
132
|
|
|
127
|
-
messages.append(
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
"
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
messages.append(
|
|
134
|
+
{
|
|
135
|
+
"role": "user",
|
|
136
|
+
"content": [
|
|
137
|
+
{
|
|
138
|
+
"type": "tool_result",
|
|
139
|
+
"tool_use_id": tool_use.id,
|
|
140
|
+
"content": tool_response,
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
}
|
|
144
|
+
)
|
|
135
145
|
|
|
136
146
|
response = await asyncio.to_thread(
|
|
137
147
|
client.messages.create,
|
|
@@ -162,7 +172,9 @@ async def evaluate_single_task(
|
|
|
162
172
|
start_time = time.time()
|
|
163
173
|
|
|
164
174
|
print(f"Task {task_index + 1}: Running task with question: {qa_pair['question']}")
|
|
165
|
-
response, tool_metrics = await agent_loop(
|
|
175
|
+
response, tool_metrics = await agent_loop(
|
|
176
|
+
client, model, qa_pair["question"], tools, connection
|
|
177
|
+
)
|
|
166
178
|
|
|
167
179
|
response_value = extract_xml_content(response, "response")
|
|
168
180
|
summary = extract_xml_content(response, "summary")
|
|
@@ -177,7 +189,9 @@ async def evaluate_single_task(
|
|
|
177
189
|
"score": int(response_value == qa_pair["answer"]) if response_value else 0,
|
|
178
190
|
"total_duration": duration_seconds,
|
|
179
191
|
"tool_calls": tool_metrics,
|
|
180
|
-
"num_tool_calls": sum(
|
|
192
|
+
"num_tool_calls": sum(
|
|
193
|
+
len(metrics["durations"]) for metrics in tool_metrics.values()
|
|
194
|
+
),
|
|
181
195
|
"summary": summary,
|
|
182
196
|
"feedback": feedback,
|
|
183
197
|
}
|
|
@@ -235,13 +249,19 @@ async def run_evaluation(
|
|
|
235
249
|
results = []
|
|
236
250
|
for i, qa_pair in enumerate(qa_pairs):
|
|
237
251
|
print(f"Processing task {i + 1}/{len(qa_pairs)}")
|
|
238
|
-
result = await evaluate_single_task(
|
|
252
|
+
result = await evaluate_single_task(
|
|
253
|
+
client, model, qa_pair, tools, connection, i
|
|
254
|
+
)
|
|
239
255
|
results.append(result)
|
|
240
256
|
|
|
241
257
|
correct = sum(r["score"] for r in results)
|
|
242
258
|
accuracy = (correct / len(results)) * 100 if results else 0
|
|
243
|
-
average_duration_s =
|
|
244
|
-
|
|
259
|
+
average_duration_s = (
|
|
260
|
+
sum(r["total_duration"] for r in results) / len(results) if results else 0
|
|
261
|
+
)
|
|
262
|
+
average_tool_calls = (
|
|
263
|
+
sum(r["num_tool_calls"] for r in results) / len(results) if results else 0
|
|
264
|
+
)
|
|
245
265
|
total_tool_calls = sum(r["num_tool_calls"] for r in results)
|
|
246
266
|
|
|
247
267
|
report = REPORT_HEADER.format(
|
|
@@ -253,20 +273,22 @@ async def run_evaluation(
|
|
|
253
273
|
total_tool_calls=total_tool_calls,
|
|
254
274
|
)
|
|
255
275
|
|
|
256
|
-
report += "".join(
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
276
|
+
report += "".join(
|
|
277
|
+
[
|
|
278
|
+
TASK_TEMPLATE.format(
|
|
279
|
+
task_num=i + 1,
|
|
280
|
+
question=qa_pair["question"],
|
|
281
|
+
expected_answer=qa_pair["answer"],
|
|
282
|
+
actual_answer=result["actual"] or "N/A",
|
|
283
|
+
correct_indicator="✅" if result["score"] else "❌",
|
|
284
|
+
total_duration=result["total_duration"],
|
|
285
|
+
tool_calls=json.dumps(result["tool_calls"], indent=2),
|
|
286
|
+
summary=result["summary"] or "N/A",
|
|
287
|
+
feedback=result["feedback"] or "N/A",
|
|
288
|
+
)
|
|
289
|
+
for i, (qa_pair, result) in enumerate(zip(qa_pairs, results))
|
|
290
|
+
]
|
|
291
|
+
)
|
|
270
292
|
|
|
271
293
|
return report
|
|
272
294
|
|
|
@@ -319,19 +341,50 @@ Examples:
|
|
|
319
341
|
)
|
|
320
342
|
|
|
321
343
|
parser.add_argument("eval_file", type=Path, help="Path to evaluation XML file")
|
|
322
|
-
parser.add_argument(
|
|
323
|
-
|
|
344
|
+
parser.add_argument(
|
|
345
|
+
"-t",
|
|
346
|
+
"--transport",
|
|
347
|
+
choices=["stdio", "sse", "http"],
|
|
348
|
+
default="stdio",
|
|
349
|
+
help="Transport type (default: stdio)",
|
|
350
|
+
)
|
|
351
|
+
parser.add_argument(
|
|
352
|
+
"-m",
|
|
353
|
+
"--model",
|
|
354
|
+
default="claude-3-7-sonnet-20250219",
|
|
355
|
+
help="Claude model to use (default: claude-3-7-sonnet-20250219)",
|
|
356
|
+
)
|
|
324
357
|
|
|
325
358
|
stdio_group = parser.add_argument_group("stdio options")
|
|
326
|
-
stdio_group.add_argument(
|
|
327
|
-
|
|
328
|
-
|
|
359
|
+
stdio_group.add_argument(
|
|
360
|
+
"-c", "--command", help="Command to run MCP server (stdio only)"
|
|
361
|
+
)
|
|
362
|
+
stdio_group.add_argument(
|
|
363
|
+
"-a", "--args", nargs="+", help="Arguments for the command (stdio only)"
|
|
364
|
+
)
|
|
365
|
+
stdio_group.add_argument(
|
|
366
|
+
"-e",
|
|
367
|
+
"--env",
|
|
368
|
+
nargs="+",
|
|
369
|
+
help="Environment variables in KEY=VALUE format (stdio only)",
|
|
370
|
+
)
|
|
329
371
|
|
|
330
372
|
remote_group = parser.add_argument_group("sse/http options")
|
|
331
373
|
remote_group.add_argument("-u", "--url", help="MCP server URL (sse/http only)")
|
|
332
|
-
remote_group.add_argument(
|
|
374
|
+
remote_group.add_argument(
|
|
375
|
+
"-H",
|
|
376
|
+
"--header",
|
|
377
|
+
nargs="+",
|
|
378
|
+
dest="headers",
|
|
379
|
+
help="HTTP headers in 'Key: Value' format (sse/http only)",
|
|
380
|
+
)
|
|
333
381
|
|
|
334
|
-
parser.add_argument(
|
|
382
|
+
parser.add_argument(
|
|
383
|
+
"-o",
|
|
384
|
+
"--output",
|
|
385
|
+
type=Path,
|
|
386
|
+
help="Output file for evaluation report (default: stdout)",
|
|
387
|
+
)
|
|
335
388
|
|
|
336
389
|
args = parser.parse_args()
|
|
337
390
|
|
|
@@ -187,7 +187,7 @@ Note: This is a text placeholder. Actual assets can be any file type.
|
|
|
187
187
|
|
|
188
188
|
def title_case_skill_name(skill_name):
|
|
189
189
|
"""Convert hyphenated skill name to Title Case for display."""
|
|
190
|
-
return
|
|
190
|
+
return " ".join(word.capitalize() for word in skill_name.split("-"))
|
|
191
191
|
|
|
192
192
|
|
|
193
193
|
def init_skill(skill_name, path):
|
|
@@ -220,11 +220,10 @@ def init_skill(skill_name, path):
|
|
|
220
220
|
# Create SKILL.md from template
|
|
221
221
|
skill_title = title_case_skill_name(skill_name)
|
|
222
222
|
skill_content = SKILL_TEMPLATE.format(
|
|
223
|
-
skill_name=skill_name,
|
|
224
|
-
skill_title=skill_title
|
|
223
|
+
skill_name=skill_name, skill_title=skill_title
|
|
225
224
|
)
|
|
226
225
|
|
|
227
|
-
skill_md_path = skill_dir /
|
|
226
|
+
skill_md_path = skill_dir / "SKILL.md"
|
|
228
227
|
try:
|
|
229
228
|
skill_md_path.write_text(skill_content)
|
|
230
229
|
print("✅ Created SKILL.md")
|
|
@@ -235,24 +234,24 @@ def init_skill(skill_name, path):
|
|
|
235
234
|
# Create resource directories with example files
|
|
236
235
|
try:
|
|
237
236
|
# Create scripts/ directory with example script
|
|
238
|
-
scripts_dir = skill_dir /
|
|
237
|
+
scripts_dir = skill_dir / "scripts"
|
|
239
238
|
scripts_dir.mkdir(exist_ok=True)
|
|
240
|
-
example_script = scripts_dir /
|
|
239
|
+
example_script = scripts_dir / "example.py"
|
|
241
240
|
example_script.write_text(EXAMPLE_SCRIPT.format(skill_name=skill_name))
|
|
242
241
|
example_script.chmod(0o755)
|
|
243
242
|
print("✅ Created scripts/example.py")
|
|
244
243
|
|
|
245
244
|
# Create references/ directory with example reference doc
|
|
246
|
-
references_dir = skill_dir /
|
|
245
|
+
references_dir = skill_dir / "references"
|
|
247
246
|
references_dir.mkdir(exist_ok=True)
|
|
248
|
-
example_reference = references_dir /
|
|
247
|
+
example_reference = references_dir / "api_reference.md"
|
|
249
248
|
example_reference.write_text(EXAMPLE_REFERENCE.format(skill_title=skill_title))
|
|
250
249
|
print("✅ Created references/api_reference.md")
|
|
251
250
|
|
|
252
251
|
# Create assets/ directory with example asset placeholder
|
|
253
|
-
assets_dir = skill_dir /
|
|
252
|
+
assets_dir = skill_dir / "assets"
|
|
254
253
|
assets_dir.mkdir(exist_ok=True)
|
|
255
|
-
example_asset = assets_dir /
|
|
254
|
+
example_asset = assets_dir / "example_asset.txt"
|
|
256
255
|
example_asset.write_text(EXAMPLE_ASSET)
|
|
257
256
|
print("✅ Created assets/example_asset.txt")
|
|
258
257
|
except Exception as e:
|
|
@@ -263,14 +262,16 @@ def init_skill(skill_name, path):
|
|
|
263
262
|
print(f"\n✅ Skill '{skill_name}' initialized successfully at {skill_dir}")
|
|
264
263
|
print("\nNext steps:")
|
|
265
264
|
print("1. Edit SKILL.md to complete the TODO items and update the description")
|
|
266
|
-
print(
|
|
265
|
+
print(
|
|
266
|
+
"2. Customize or delete the example files in scripts/, references/, and assets/"
|
|
267
|
+
)
|
|
267
268
|
print("3. Run the validator when ready to check the skill structure")
|
|
268
269
|
|
|
269
270
|
return skill_dir
|
|
270
271
|
|
|
271
272
|
|
|
272
273
|
def main():
|
|
273
|
-
if len(sys.argv) < 4 or sys.argv[2] !=
|
|
274
|
+
if len(sys.argv) < 4 or sys.argv[2] != "--path":
|
|
274
275
|
print("Usage: init_skill.py <skill-name> --path <path>")
|
|
275
276
|
print("\nSkill name requirements:")
|
|
276
277
|
print(" - Hyphen-case identifier (e.g., 'data-analyzer')")
|
|
@@ -66,9 +66,9 @@ def package_skill(skill_path, output_dir=None):
|
|
|
66
66
|
|
|
67
67
|
# Create the zip file
|
|
68
68
|
try:
|
|
69
|
-
with zipfile.ZipFile(zip_filename,
|
|
69
|
+
with zipfile.ZipFile(zip_filename, "w", zipfile.ZIP_DEFLATED) as zipf:
|
|
70
70
|
# Walk through the skill directory
|
|
71
|
-
for file_path in skill_path.rglob(
|
|
71
|
+
for file_path in skill_path.rglob("*"):
|
|
72
72
|
if file_path.is_file():
|
|
73
73
|
# Calculate the relative path within the zip
|
|
74
74
|
arcname = file_path.relative_to(skill_path.parent)
|
|
@@ -85,7 +85,9 @@ def package_skill(skill_path, output_dir=None):
|
|
|
85
85
|
|
|
86
86
|
def main():
|
|
87
87
|
if len(sys.argv) < 2:
|
|
88
|
-
print(
|
|
88
|
+
print(
|
|
89
|
+
"Usage: python utils/package_skill.py <path/to/skill-folder> [output-directory]"
|
|
90
|
+
)
|
|
89
91
|
print("\nExample:")
|
|
90
92
|
print(" python utils/package_skill.py skills/public/my-skill")
|
|
91
93
|
print(" python utils/package_skill.py skills/public/my-skill ./dist")
|
|
@@ -13,48 +13,55 @@ def validate_skill(skill_path):
|
|
|
13
13
|
skill_path = Path(skill_path)
|
|
14
14
|
|
|
15
15
|
# Check SKILL.md exists
|
|
16
|
-
skill_md = skill_path /
|
|
16
|
+
skill_md = skill_path / "SKILL.md"
|
|
17
17
|
if not skill_md.exists():
|
|
18
18
|
return False, "SKILL.md not found"
|
|
19
19
|
|
|
20
20
|
# Read and validate frontmatter
|
|
21
21
|
content = skill_md.read_text()
|
|
22
|
-
if not content.startswith(
|
|
22
|
+
if not content.startswith("---"):
|
|
23
23
|
return False, "No YAML frontmatter found"
|
|
24
24
|
|
|
25
25
|
# Extract frontmatter
|
|
26
|
-
match = re.match(r
|
|
26
|
+
match = re.match(r"^---\n(.*?)\n---", content, re.DOTALL)
|
|
27
27
|
if not match:
|
|
28
28
|
return False, "Invalid frontmatter format"
|
|
29
29
|
|
|
30
30
|
frontmatter = match.group(1)
|
|
31
31
|
|
|
32
32
|
# Check required fields
|
|
33
|
-
if
|
|
33
|
+
if "name:" not in frontmatter:
|
|
34
34
|
return False, "Missing 'name' in frontmatter"
|
|
35
|
-
if
|
|
35
|
+
if "description:" not in frontmatter:
|
|
36
36
|
return False, "Missing 'description' in frontmatter"
|
|
37
37
|
|
|
38
38
|
# Extract name for validation
|
|
39
|
-
name_match = re.search(r
|
|
39
|
+
name_match = re.search(r"name:\s*(.+)", frontmatter)
|
|
40
40
|
if name_match:
|
|
41
41
|
name = name_match.group(1).strip()
|
|
42
42
|
# Check naming convention (hyphen-case: lowercase with hyphens)
|
|
43
|
-
if not re.match(r
|
|
44
|
-
return
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
if not re.match(r"^[a-z0-9-]+$", name):
|
|
44
|
+
return (
|
|
45
|
+
False,
|
|
46
|
+
f"Name '{name}' should be hyphen-case (lowercase letters, digits, and hyphens only)",
|
|
47
|
+
)
|
|
48
|
+
if name.startswith("-") or name.endswith("-") or "--" in name:
|
|
49
|
+
return (
|
|
50
|
+
False,
|
|
51
|
+
f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens",
|
|
52
|
+
)
|
|
47
53
|
|
|
48
54
|
# Extract and validate description
|
|
49
|
-
desc_match = re.search(r
|
|
55
|
+
desc_match = re.search(r"description:\s*(.+)", frontmatter)
|
|
50
56
|
if desc_match:
|
|
51
57
|
description = desc_match.group(1).strip()
|
|
52
58
|
# Check for angle brackets
|
|
53
|
-
if
|
|
59
|
+
if "<" in description or ">" in description:
|
|
54
60
|
return False, "Description cannot contain angle brackets (< or >)"
|
|
55
61
|
|
|
56
62
|
return True, "Skill is valid!"
|
|
57
63
|
|
|
64
|
+
|
|
58
65
|
if __name__ == "__main__":
|
|
59
66
|
if len(sys.argv) != 2:
|
|
60
67
|
print("Usage: python quick_validate.py <skill_directory>")
|
|
@@ -433,6 +433,12 @@ def sort_items(items):
|
|
|
433
433
|
|
|
434
434
|
### Load Testing
|
|
435
435
|
|
|
436
|
+
> **Note:** Locust is an optional dependency. Install it separately if you need load testing capabilities:
|
|
437
|
+
> ```bash
|
|
438
|
+
> pip install "claude-mpm[agents-load-testing]"
|
|
439
|
+
> ```
|
|
440
|
+
> Or install locust directly: `pip install locust>=2.15.0`
|
|
441
|
+
|
|
436
442
|
```python
|
|
437
443
|
# Using locust for load testing
|
|
438
444
|
from locust import HttpUser, task, between
|
|
@@ -2,13 +2,13 @@ from playwright.sync_api import sync_playwright
|
|
|
2
2
|
|
|
3
3
|
# Example: Capturing console logs during browser automation
|
|
4
4
|
|
|
5
|
-
url =
|
|
5
|
+
url = "http://localhost:5173" # Replace with your URL
|
|
6
6
|
|
|
7
7
|
console_logs = []
|
|
8
8
|
|
|
9
9
|
with sync_playwright() as p:
|
|
10
10
|
browser = p.chromium.launch(headless=True)
|
|
11
|
-
page = browser.new_page(viewport={
|
|
11
|
+
page = browser.new_page(viewport={"width": 1920, "height": 1080})
|
|
12
12
|
|
|
13
13
|
# Set up console log capture
|
|
14
14
|
def handle_console_message(msg):
|
|
@@ -19,17 +19,17 @@ with sync_playwright() as p:
|
|
|
19
19
|
|
|
20
20
|
# Navigate to page
|
|
21
21
|
page.goto(url)
|
|
22
|
-
page.wait_for_load_state(
|
|
22
|
+
page.wait_for_load_state("networkidle")
|
|
23
23
|
|
|
24
24
|
# Interact with the page (triggers console logs)
|
|
25
|
-
page.click(
|
|
25
|
+
page.click("text=Dashboard")
|
|
26
26
|
page.wait_for_timeout(1000)
|
|
27
27
|
|
|
28
28
|
browser.close()
|
|
29
29
|
|
|
30
30
|
# Save console logs to file
|
|
31
|
-
with open(
|
|
32
|
-
f.write(
|
|
31
|
+
with open("/mnt/user-data/outputs/console.log", "w") as f:
|
|
32
|
+
f.write("\n".join(console_logs))
|
|
33
33
|
|
|
34
34
|
print(f"\nCaptured {len(console_logs)} console messages")
|
|
35
35
|
print("Logs saved to: /mnt/user-data/outputs/console.log")
|
|
@@ -7,34 +7,38 @@ with sync_playwright() as p:
|
|
|
7
7
|
page = browser.new_page()
|
|
8
8
|
|
|
9
9
|
# Navigate to page and wait for it to fully load
|
|
10
|
-
page.goto(
|
|
11
|
-
page.wait_for_load_state(
|
|
10
|
+
page.goto("http://localhost:5173")
|
|
11
|
+
page.wait_for_load_state("networkidle")
|
|
12
12
|
|
|
13
13
|
# Discover all buttons on the page
|
|
14
|
-
buttons = page.locator(
|
|
14
|
+
buttons = page.locator("button").all()
|
|
15
15
|
print(f"Found {len(buttons)} buttons:")
|
|
16
16
|
for i, button in enumerate(buttons):
|
|
17
17
|
text = button.inner_text() if button.is_visible() else "[hidden]"
|
|
18
18
|
print(f" [{i}] {text}")
|
|
19
19
|
|
|
20
20
|
# Discover links
|
|
21
|
-
links = page.locator(
|
|
21
|
+
links = page.locator("a[href]").all()
|
|
22
22
|
print(f"\nFound {len(links)} links:")
|
|
23
23
|
for link in links[:5]: # Show first 5
|
|
24
24
|
text = link.inner_text().strip()
|
|
25
|
-
href = link.get_attribute(
|
|
25
|
+
href = link.get_attribute("href")
|
|
26
26
|
print(f" - {text} -> {href}")
|
|
27
27
|
|
|
28
28
|
# Discover input fields
|
|
29
|
-
inputs = page.locator(
|
|
29
|
+
inputs = page.locator("input, textarea, select").all()
|
|
30
30
|
print(f"\nFound {len(inputs)} input fields:")
|
|
31
31
|
for input_elem in inputs:
|
|
32
|
-
name =
|
|
33
|
-
|
|
32
|
+
name = (
|
|
33
|
+
input_elem.get_attribute("name")
|
|
34
|
+
or input_elem.get_attribute("id")
|
|
35
|
+
or "[unnamed]"
|
|
36
|
+
)
|
|
37
|
+
input_type = input_elem.get_attribute("type") or "text"
|
|
34
38
|
print(f" - {name} ({input_type})")
|
|
35
39
|
|
|
36
40
|
# Take screenshot for visual reference
|
|
37
|
-
page.screenshot(path=
|
|
41
|
+
page.screenshot(path="/tmp/page_discovery.png", full_page=True)
|
|
38
42
|
print("\nScreenshot saved to /tmp/page_discovery.png")
|
|
39
43
|
|
|
40
44
|
browser.close()
|
|
@@ -4,30 +4,30 @@ from playwright.sync_api import sync_playwright
|
|
|
4
4
|
|
|
5
5
|
# Example: Automating interaction with static HTML files using file:// URLs
|
|
6
6
|
|
|
7
|
-
html_file_path = os.path.abspath(
|
|
8
|
-
file_url = f
|
|
7
|
+
html_file_path = os.path.abspath("path/to/your/file.html")
|
|
8
|
+
file_url = f"file://{html_file_path}"
|
|
9
9
|
|
|
10
10
|
with sync_playwright() as p:
|
|
11
11
|
browser = p.chromium.launch(headless=True)
|
|
12
|
-
page = browser.new_page(viewport={
|
|
12
|
+
page = browser.new_page(viewport={"width": 1920, "height": 1080})
|
|
13
13
|
|
|
14
14
|
# Navigate to local HTML file
|
|
15
15
|
page.goto(file_url)
|
|
16
16
|
|
|
17
17
|
# Take screenshot
|
|
18
|
-
page.screenshot(path=
|
|
18
|
+
page.screenshot(path="/mnt/user-data/outputs/static_page.png", full_page=True)
|
|
19
19
|
|
|
20
20
|
# Interact with elements
|
|
21
|
-
page.click(
|
|
22
|
-
page.fill(
|
|
23
|
-
page.fill(
|
|
21
|
+
page.click("text=Click Me")
|
|
22
|
+
page.fill("#name", "John Doe")
|
|
23
|
+
page.fill("#email", "john@example.com")
|
|
24
24
|
|
|
25
25
|
# Submit form
|
|
26
26
|
page.click('button[type="submit"]')
|
|
27
27
|
page.wait_for_timeout(500)
|
|
28
28
|
|
|
29
29
|
# Take final screenshot
|
|
30
|
-
page.screenshot(path=
|
|
30
|
+
page.screenshot(path="/mnt/user-data/outputs/after_submit.png", full_page=True)
|
|
31
31
|
|
|
32
32
|
browser.close()
|
|
33
33
|
|
|
@@ -26,7 +26,7 @@ def is_server_ready(port, timeout=30):
|
|
|
26
26
|
start_time = time.time()
|
|
27
27
|
while time.time() - start_time < timeout:
|
|
28
28
|
try:
|
|
29
|
-
with socket.create_connection((
|
|
29
|
+
with socket.create_connection(("localhost", port), timeout=1):
|
|
30
30
|
return True
|
|
31
31
|
except (OSError, ConnectionRefusedError):
|
|
32
32
|
time.sleep(0.5)
|
|
@@ -34,16 +34,36 @@ def is_server_ready(port, timeout=30):
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
def main():
|
|
37
|
-
parser = argparse.ArgumentParser(description=
|
|
38
|
-
parser.add_argument(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
parser = argparse.ArgumentParser(description="Run command with one or more servers")
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
"--server",
|
|
40
|
+
action="append",
|
|
41
|
+
dest="servers",
|
|
42
|
+
required=True,
|
|
43
|
+
help="Server command (can be repeated)",
|
|
44
|
+
)
|
|
45
|
+
parser.add_argument(
|
|
46
|
+
"--port",
|
|
47
|
+
action="append",
|
|
48
|
+
dest="ports",
|
|
49
|
+
type=int,
|
|
50
|
+
required=True,
|
|
51
|
+
help="Port for each server (must match --server count)",
|
|
52
|
+
)
|
|
53
|
+
parser.add_argument(
|
|
54
|
+
"--timeout",
|
|
55
|
+
type=int,
|
|
56
|
+
default=30,
|
|
57
|
+
help="Timeout in seconds per server (default: 30)",
|
|
58
|
+
)
|
|
59
|
+
parser.add_argument(
|
|
60
|
+
"command", nargs=argparse.REMAINDER, help="Command to run after server(s) ready"
|
|
61
|
+
)
|
|
42
62
|
|
|
43
63
|
args = parser.parse_args()
|
|
44
64
|
|
|
45
65
|
# Remove the '--' separator if present
|
|
46
|
-
if args.command and args.command[0] ==
|
|
66
|
+
if args.command and args.command[0] == "--":
|
|
47
67
|
args.command = args.command[1:]
|
|
48
68
|
|
|
49
69
|
if not args.command:
|
|
@@ -57,28 +77,30 @@ def main():
|
|
|
57
77
|
|
|
58
78
|
servers = []
|
|
59
79
|
for cmd, port in zip(args.servers, args.ports):
|
|
60
|
-
servers.append({
|
|
80
|
+
servers.append({"cmd": cmd, "port": port})
|
|
61
81
|
|
|
62
82
|
server_processes = []
|
|
63
83
|
|
|
64
84
|
try:
|
|
65
85
|
# Start all servers
|
|
66
86
|
for i, server in enumerate(servers):
|
|
67
|
-
print(f"Starting server {i+1}/{len(servers)}: {server['cmd']}")
|
|
87
|
+
print(f"Starting server {i + 1}/{len(servers)}: {server['cmd']}")
|
|
68
88
|
|
|
69
89
|
# Use shell=True to support commands with cd and &&
|
|
70
90
|
process = subprocess.Popen(
|
|
71
|
-
server[
|
|
91
|
+
server["cmd"],
|
|
72
92
|
shell=True,
|
|
73
93
|
stdout=subprocess.PIPE,
|
|
74
|
-
stderr=subprocess.PIPE
|
|
94
|
+
stderr=subprocess.PIPE,
|
|
75
95
|
)
|
|
76
96
|
server_processes.append(process)
|
|
77
97
|
|
|
78
98
|
# Wait for this server to be ready
|
|
79
99
|
print(f"Waiting for server on port {server['port']}...")
|
|
80
|
-
if not is_server_ready(server[
|
|
81
|
-
raise RuntimeError(
|
|
100
|
+
if not is_server_ready(server["port"], timeout=args.timeout):
|
|
101
|
+
raise RuntimeError(
|
|
102
|
+
f"Server failed to start on port {server['port']} within {args.timeout}s"
|
|
103
|
+
)
|
|
82
104
|
|
|
83
105
|
print(f"Server ready on port {server['port']}")
|
|
84
106
|
|
|
@@ -99,9 +121,9 @@ def main():
|
|
|
99
121
|
except subprocess.TimeoutExpired:
|
|
100
122
|
process.kill()
|
|
101
123
|
process.wait()
|
|
102
|
-
print(f"Server {i+1} stopped")
|
|
124
|
+
print(f"Server {i + 1} stopped")
|
|
103
125
|
print("All servers stopped")
|
|
104
126
|
|
|
105
127
|
|
|
106
|
-
if __name__ ==
|
|
128
|
+
if __name__ == "__main__":
|
|
107
129
|
main()
|