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,394 @@
|
|
|
1
|
+
"""Ticket management question templates.
|
|
2
|
+
|
|
3
|
+
This module provides templates for gathering user preferences about ticket
|
|
4
|
+
prioritization, scope, and management during sprint planning and execution.
|
|
5
|
+
|
|
6
|
+
Templates:
|
|
7
|
+
- TicketPrioritizationTemplate: How to order/prioritize tickets
|
|
8
|
+
- TicketScopeTemplate: Testing and documentation requirements per ticket
|
|
9
|
+
- TicketDependencyTemplate: How to handle ticket dependencies
|
|
10
|
+
|
|
11
|
+
These templates help PM make informed decisions about ticket execution order
|
|
12
|
+
and completeness criteria.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
19
|
+
from claude_mpm.templates.questions.base import ConditionalTemplate
|
|
20
|
+
from claude_mpm.utils.structured_questions import QuestionBuilder, QuestionSet
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from claude_mpm.utils.structured_questions import StructuredQuestion
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TicketPrioritizationTemplate(ConditionalTemplate):
|
|
27
|
+
"""Template for ticket prioritization decisions.
|
|
28
|
+
|
|
29
|
+
Asks about:
|
|
30
|
+
- How to order tickets (priority-based, dependency-based, etc.)
|
|
31
|
+
- Whether to work serially or in parallel
|
|
32
|
+
- How to handle blockers
|
|
33
|
+
|
|
34
|
+
Context Parameters:
|
|
35
|
+
num_tickets (int): Number of tickets to prioritize
|
|
36
|
+
has_dependencies (bool): Whether tickets have interdependencies
|
|
37
|
+
team_size (int): Number of engineers available
|
|
38
|
+
|
|
39
|
+
Example:
|
|
40
|
+
>>> template = TicketPrioritizationTemplate(
|
|
41
|
+
... num_tickets=5,
|
|
42
|
+
... has_dependencies=True,
|
|
43
|
+
... team_size=1
|
|
44
|
+
... )
|
|
45
|
+
>>> question_set = template.build()
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
num_tickets: int = 1,
|
|
51
|
+
has_dependencies: bool = False,
|
|
52
|
+
team_size: int = 1,
|
|
53
|
+
**context,
|
|
54
|
+
):
|
|
55
|
+
"""Initialize ticket prioritization template.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
num_tickets: Number of tickets to manage
|
|
59
|
+
has_dependencies: Whether tickets depend on each other
|
|
60
|
+
team_size: Number of engineers available
|
|
61
|
+
**context: Additional context values
|
|
62
|
+
"""
|
|
63
|
+
super().__init__(
|
|
64
|
+
num_tickets=num_tickets,
|
|
65
|
+
has_dependencies=has_dependencies,
|
|
66
|
+
team_size=team_size,
|
|
67
|
+
**context,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def build(self) -> QuestionSet:
|
|
71
|
+
"""Build ticket prioritization questions.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
QuestionSet with prioritization questions
|
|
75
|
+
"""
|
|
76
|
+
num_tickets = self.get_context("num_tickets", 1)
|
|
77
|
+
has_dependencies = self.get_context("has_dependencies", False)
|
|
78
|
+
team_size = self.get_context("team_size", 1)
|
|
79
|
+
|
|
80
|
+
questions: list[StructuredQuestion] = []
|
|
81
|
+
|
|
82
|
+
# Question 1: Prioritization strategy (only if multiple tickets)
|
|
83
|
+
if num_tickets > 1:
|
|
84
|
+
if has_dependencies:
|
|
85
|
+
priority_question = (
|
|
86
|
+
QuestionBuilder()
|
|
87
|
+
.ask("How should we handle ticket dependencies?")
|
|
88
|
+
.header("Dependencies")
|
|
89
|
+
.add_option(
|
|
90
|
+
"Sequential execution",
|
|
91
|
+
"Complete tickets in dependency order (foundational work first)",
|
|
92
|
+
)
|
|
93
|
+
.add_option(
|
|
94
|
+
"Parallel where possible",
|
|
95
|
+
"Work on independent tickets in parallel, sequential for dependent ones",
|
|
96
|
+
)
|
|
97
|
+
.build()
|
|
98
|
+
)
|
|
99
|
+
else:
|
|
100
|
+
priority_question = (
|
|
101
|
+
QuestionBuilder()
|
|
102
|
+
.ask("How should we prioritize the tickets?")
|
|
103
|
+
.header("Priority")
|
|
104
|
+
.add_option(
|
|
105
|
+
"User-visible first",
|
|
106
|
+
"Prioritize features that directly impact users",
|
|
107
|
+
)
|
|
108
|
+
.add_option(
|
|
109
|
+
"Infrastructure first",
|
|
110
|
+
"Build foundational components before user-facing features",
|
|
111
|
+
)
|
|
112
|
+
.add_option(
|
|
113
|
+
"Quick wins first",
|
|
114
|
+
"Start with easiest tickets to build momentum",
|
|
115
|
+
)
|
|
116
|
+
.add_option(
|
|
117
|
+
"High risk first",
|
|
118
|
+
"Tackle uncertain/risky tickets early to derisk project",
|
|
119
|
+
)
|
|
120
|
+
.build()
|
|
121
|
+
)
|
|
122
|
+
questions.append(priority_question)
|
|
123
|
+
|
|
124
|
+
# Question 2: Execution strategy (only if multiple tickets and team)
|
|
125
|
+
if num_tickets > 1 and team_size >= 1:
|
|
126
|
+
execution_question = (
|
|
127
|
+
QuestionBuilder()
|
|
128
|
+
.ask("How should tickets be executed?")
|
|
129
|
+
.header("Execution")
|
|
130
|
+
.add_option(
|
|
131
|
+
"One at a time",
|
|
132
|
+
"Complete each ticket fully before starting the next",
|
|
133
|
+
)
|
|
134
|
+
.add_option(
|
|
135
|
+
"Parallel execution",
|
|
136
|
+
"Work on multiple tickets simultaneously when possible",
|
|
137
|
+
)
|
|
138
|
+
.build()
|
|
139
|
+
)
|
|
140
|
+
questions.append(execution_question)
|
|
141
|
+
|
|
142
|
+
# Fallback for single ticket or default case
|
|
143
|
+
if not questions:
|
|
144
|
+
scope_question = (
|
|
145
|
+
QuestionBuilder()
|
|
146
|
+
.ask("What should be the ticket completion criteria?")
|
|
147
|
+
.header("Criteria")
|
|
148
|
+
.add_option(
|
|
149
|
+
"Implementation only",
|
|
150
|
+
"Code implementation complete, basic functionality working",
|
|
151
|
+
)
|
|
152
|
+
.add_option(
|
|
153
|
+
"Implementation + tests",
|
|
154
|
+
"Code complete with passing unit tests",
|
|
155
|
+
)
|
|
156
|
+
.build()
|
|
157
|
+
)
|
|
158
|
+
questions.append(scope_question)
|
|
159
|
+
|
|
160
|
+
return QuestionSet(questions)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class TicketScopeTemplate(ConditionalTemplate):
|
|
164
|
+
"""Template for ticket scope and completeness requirements.
|
|
165
|
+
|
|
166
|
+
Asks about:
|
|
167
|
+
- Testing requirements (unit, integration, e2e)
|
|
168
|
+
- Documentation requirements
|
|
169
|
+
- Code review requirements
|
|
170
|
+
- Definition of done
|
|
171
|
+
|
|
172
|
+
Context Parameters:
|
|
173
|
+
ticket_type (str): Type of ticket (feature, bug, refactor)
|
|
174
|
+
is_user_facing (bool): Whether ticket affects end users
|
|
175
|
+
project_maturity (str): Project stage (prototype, beta, production)
|
|
176
|
+
|
|
177
|
+
Example:
|
|
178
|
+
>>> template = TicketScopeTemplate(
|
|
179
|
+
... ticket_type="feature",
|
|
180
|
+
... is_user_facing=True,
|
|
181
|
+
... project_maturity="production"
|
|
182
|
+
... )
|
|
183
|
+
>>> question_set = template.build()
|
|
184
|
+
"""
|
|
185
|
+
|
|
186
|
+
def __init__(
|
|
187
|
+
self,
|
|
188
|
+
ticket_type: str | None = "feature",
|
|
189
|
+
is_user_facing: bool = False,
|
|
190
|
+
project_maturity: str = "development",
|
|
191
|
+
**context,
|
|
192
|
+
):
|
|
193
|
+
"""Initialize ticket scope template.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
ticket_type: Type of ticket (feature, bug, refactor, etc.)
|
|
197
|
+
is_user_facing: Whether changes affect end users
|
|
198
|
+
project_maturity: Stage of project (prototype, development, production)
|
|
199
|
+
**context: Additional context values
|
|
200
|
+
"""
|
|
201
|
+
super().__init__(
|
|
202
|
+
ticket_type=ticket_type,
|
|
203
|
+
is_user_facing=is_user_facing,
|
|
204
|
+
project_maturity=project_maturity,
|
|
205
|
+
**context,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
def build(self) -> QuestionSet:
|
|
209
|
+
"""Build ticket scope questions.
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
QuestionSet with scope questions
|
|
213
|
+
"""
|
|
214
|
+
ticket_type = self.get_context("ticket_type", "feature")
|
|
215
|
+
is_user_facing = self.get_context("is_user_facing", False)
|
|
216
|
+
project_maturity = self.get_context("project_maturity", "development")
|
|
217
|
+
|
|
218
|
+
questions: list[StructuredQuestion] = []
|
|
219
|
+
|
|
220
|
+
# Question 1: Testing requirements
|
|
221
|
+
if project_maturity == "production" or is_user_facing:
|
|
222
|
+
testing_question = (
|
|
223
|
+
QuestionBuilder()
|
|
224
|
+
.ask("What testing is required for this ticket?")
|
|
225
|
+
.header("Testing")
|
|
226
|
+
.add_option(
|
|
227
|
+
"Comprehensive",
|
|
228
|
+
"Unit tests, integration tests, and e2e tests required",
|
|
229
|
+
)
|
|
230
|
+
.add_option(
|
|
231
|
+
"Standard",
|
|
232
|
+
"Unit tests and integration tests for critical paths",
|
|
233
|
+
)
|
|
234
|
+
.add_option(
|
|
235
|
+
"Basic",
|
|
236
|
+
"Unit tests for core functionality only",
|
|
237
|
+
)
|
|
238
|
+
.build()
|
|
239
|
+
)
|
|
240
|
+
else:
|
|
241
|
+
testing_question = (
|
|
242
|
+
QuestionBuilder()
|
|
243
|
+
.ask("What testing is required for this ticket?")
|
|
244
|
+
.header("Testing")
|
|
245
|
+
.add_option(
|
|
246
|
+
"Unit tests",
|
|
247
|
+
"Unit tests covering core functionality",
|
|
248
|
+
)
|
|
249
|
+
.add_option(
|
|
250
|
+
"Integration tests",
|
|
251
|
+
"Integration tests for component interactions",
|
|
252
|
+
)
|
|
253
|
+
.add_option(
|
|
254
|
+
"Manual testing",
|
|
255
|
+
"Manual verification sufficient for now",
|
|
256
|
+
)
|
|
257
|
+
.build()
|
|
258
|
+
)
|
|
259
|
+
questions.append(testing_question)
|
|
260
|
+
|
|
261
|
+
# Question 2: Documentation requirements
|
|
262
|
+
if is_user_facing or ticket_type == "feature":
|
|
263
|
+
docs_question = (
|
|
264
|
+
QuestionBuilder()
|
|
265
|
+
.ask("What documentation is needed?")
|
|
266
|
+
.header("Docs")
|
|
267
|
+
.add_option(
|
|
268
|
+
"Full documentation",
|
|
269
|
+
"API docs, user guide, and code comments",
|
|
270
|
+
)
|
|
271
|
+
.add_option(
|
|
272
|
+
"API docs only",
|
|
273
|
+
"Document public interfaces and usage examples",
|
|
274
|
+
)
|
|
275
|
+
.add_option(
|
|
276
|
+
"Code comments",
|
|
277
|
+
"Inline comments for complex logic only",
|
|
278
|
+
)
|
|
279
|
+
.add_option(
|
|
280
|
+
"None",
|
|
281
|
+
"Code is self-documenting, no additional docs needed",
|
|
282
|
+
)
|
|
283
|
+
.build()
|
|
284
|
+
)
|
|
285
|
+
questions.append(docs_question)
|
|
286
|
+
|
|
287
|
+
return QuestionSet(questions)
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class TicketDependencyTemplate(ConditionalTemplate):
|
|
291
|
+
"""Template for handling ticket dependencies and blocking issues.
|
|
292
|
+
|
|
293
|
+
Asks about:
|
|
294
|
+
- How to handle blocked tickets
|
|
295
|
+
- Whether to wait or work around dependencies
|
|
296
|
+
- Parallel work strategies
|
|
297
|
+
|
|
298
|
+
Context Parameters:
|
|
299
|
+
blocked_tickets (int): Number of tickets currently blocked
|
|
300
|
+
blocking_type (str): Type of blocker (technical, external, approval)
|
|
301
|
+
|
|
302
|
+
Example:
|
|
303
|
+
>>> template = TicketDependencyTemplate(
|
|
304
|
+
... blocked_tickets=2,
|
|
305
|
+
... blocking_type="external"
|
|
306
|
+
... )
|
|
307
|
+
>>> question_set = template.build()
|
|
308
|
+
"""
|
|
309
|
+
|
|
310
|
+
def __init__(
|
|
311
|
+
self,
|
|
312
|
+
blocked_tickets: int = 0,
|
|
313
|
+
blocking_type: str | None = None,
|
|
314
|
+
**context,
|
|
315
|
+
):
|
|
316
|
+
"""Initialize ticket dependency template.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
blocked_tickets: Number of blocked tickets
|
|
320
|
+
blocking_type: Type of blocker (technical, external, approval, etc.)
|
|
321
|
+
**context: Additional context values
|
|
322
|
+
"""
|
|
323
|
+
super().__init__(
|
|
324
|
+
blocked_tickets=blocked_tickets, blocking_type=blocking_type, **context
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
def build(self) -> QuestionSet:
|
|
328
|
+
"""Build dependency handling questions.
|
|
329
|
+
|
|
330
|
+
Returns:
|
|
331
|
+
QuestionSet with dependency questions
|
|
332
|
+
"""
|
|
333
|
+
blocked_tickets = self.get_context("blocked_tickets", 0)
|
|
334
|
+
blocking_type = self.get_context("blocking_type")
|
|
335
|
+
|
|
336
|
+
questions: list[StructuredQuestion] = []
|
|
337
|
+
|
|
338
|
+
# Question about handling blockers
|
|
339
|
+
if blocked_tickets > 0:
|
|
340
|
+
if blocking_type == "external":
|
|
341
|
+
blocker_question = (
|
|
342
|
+
QuestionBuilder()
|
|
343
|
+
.ask("How should we handle external dependencies?")
|
|
344
|
+
.header("Blockers")
|
|
345
|
+
.add_option(
|
|
346
|
+
"Wait for unblock",
|
|
347
|
+
"Pause blocked tickets until external dependency resolves",
|
|
348
|
+
)
|
|
349
|
+
.add_option(
|
|
350
|
+
"Mock and continue",
|
|
351
|
+
"Create mocks/stubs to continue development",
|
|
352
|
+
)
|
|
353
|
+
.add_option(
|
|
354
|
+
"Work around",
|
|
355
|
+
"Find alternative implementation to avoid dependency",
|
|
356
|
+
)
|
|
357
|
+
.build()
|
|
358
|
+
)
|
|
359
|
+
else:
|
|
360
|
+
blocker_question = (
|
|
361
|
+
QuestionBuilder()
|
|
362
|
+
.ask("How should we handle blocked tickets?")
|
|
363
|
+
.header("Blockers")
|
|
364
|
+
.add_option(
|
|
365
|
+
"Resolve blockers first",
|
|
366
|
+
"Prioritize unblocking tickets before continuing",
|
|
367
|
+
)
|
|
368
|
+
.add_option(
|
|
369
|
+
"Parallel work",
|
|
370
|
+
"Work on unblocked tickets while resolving blockers",
|
|
371
|
+
)
|
|
372
|
+
.build()
|
|
373
|
+
)
|
|
374
|
+
questions.append(blocker_question)
|
|
375
|
+
|
|
376
|
+
# Default question if no specific blockers
|
|
377
|
+
if not questions:
|
|
378
|
+
dependency_question = (
|
|
379
|
+
QuestionBuilder()
|
|
380
|
+
.ask("How should we manage ticket dependencies?")
|
|
381
|
+
.header("Dependencies")
|
|
382
|
+
.add_option(
|
|
383
|
+
"Strict ordering",
|
|
384
|
+
"Maintain strict dependency order, wait for prerequisites",
|
|
385
|
+
)
|
|
386
|
+
.add_option(
|
|
387
|
+
"Flexible approach",
|
|
388
|
+
"Start dependent work in parallel with preparation work",
|
|
389
|
+
)
|
|
390
|
+
.build()
|
|
391
|
+
)
|
|
392
|
+
questions.append(dependency_question)
|
|
393
|
+
|
|
394
|
+
return QuestionSet(questions)
|
claude_mpm/tools/__main__.py
CHANGED
|
@@ -173,14 +173,14 @@ def main():
|
|
|
173
173
|
Code Analysis Summary
|
|
174
174
|
=====================
|
|
175
175
|
Path: {path}
|
|
176
|
-
Files processed: {stats.get(
|
|
177
|
-
Total nodes: {stats.get(
|
|
178
|
-
Classes: {stats.get(
|
|
179
|
-
Functions: {stats.get(
|
|
180
|
-
Imports: {stats.get(
|
|
181
|
-
Languages: {
|
|
182
|
-
Average complexity: {stats.get(
|
|
183
|
-
Duration: {stats.get(
|
|
176
|
+
Files processed: {stats.get("files_processed", 0)}
|
|
177
|
+
Total nodes: {stats.get("total_nodes", 0)}
|
|
178
|
+
Classes: {stats.get("classes", 0)}
|
|
179
|
+
Functions: {stats.get("functions", 0)}
|
|
180
|
+
Imports: {stats.get("imports", 0)}
|
|
181
|
+
Languages: {", ".join(stats.get("languages", []))}
|
|
182
|
+
Average complexity: {stats.get("avg_complexity", 0):.2f}
|
|
183
|
+
Duration: {stats.get("duration", 0):.2f}s
|
|
184
184
|
"""
|
|
185
185
|
if output_file:
|
|
186
186
|
output_file.write(summary)
|
|
@@ -68,7 +68,7 @@ class FileAnalyzer:
|
|
|
68
68
|
self.event_manager.emit_cache_hit(path)
|
|
69
69
|
filtered_nodes = self._filter_nodes(cached_nodes)
|
|
70
70
|
else:
|
|
71
|
-
|
|
71
|
+
_nodes, filtered_nodes, duration = self._analyze_and_cache_file(
|
|
72
72
|
path, language, cache_key
|
|
73
73
|
)
|
|
74
74
|
self.event_manager.emit_analysis_complete(path, filtered_nodes, duration)
|
|
@@ -16,6 +16,7 @@ import sys
|
|
|
16
16
|
import time
|
|
17
17
|
from typing import Any, Dict, List, Optional, Set, Tuple
|
|
18
18
|
|
|
19
|
+
import yaml
|
|
19
20
|
from packaging.requirements import InvalidRequirement, Requirement
|
|
20
21
|
|
|
21
22
|
from ..core.logger import get_logger
|
|
@@ -89,10 +90,48 @@ class AgentDependencyLoader:
|
|
|
89
90
|
self.deployed_agents = deployed_agents
|
|
90
91
|
return deployed_agents
|
|
91
92
|
|
|
93
|
+
def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
|
|
94
|
+
"""
|
|
95
|
+
Extract and parse YAML frontmatter from markdown.
|
|
96
|
+
|
|
97
|
+
Frontmatter must be at the start of the file, delimited by '---'.
|
|
98
|
+
Example:
|
|
99
|
+
---
|
|
100
|
+
name: agent_name
|
|
101
|
+
dependencies:
|
|
102
|
+
python:
|
|
103
|
+
- package>=1.0.0
|
|
104
|
+
---
|
|
105
|
+
# Agent content...
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
content: File content to parse
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Parsed YAML frontmatter as dict, or None if not found/invalid
|
|
112
|
+
"""
|
|
113
|
+
if not content.strip().startswith("---"):
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
# Split on --- delimiters
|
|
117
|
+
parts = content.split("---", 2)
|
|
118
|
+
if len(parts) < 3:
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
return yaml.safe_load(parts[1])
|
|
123
|
+
except yaml.YAMLError as e:
|
|
124
|
+
logger.warning(f"Failed to parse YAML frontmatter: {e}")
|
|
125
|
+
return None
|
|
126
|
+
|
|
92
127
|
def load_agent_dependencies(self) -> Dict[str, Dict]:
|
|
93
128
|
"""
|
|
94
129
|
Load dependency information for deployed agents from their source configs.
|
|
95
130
|
|
|
131
|
+
Searches for agent configuration in both markdown (.md) and JSON (.json) formats.
|
|
132
|
+
Markdown files with YAML frontmatter are searched first for better maintainability.
|
|
133
|
+
Falls back to JSON format for backward compatibility.
|
|
134
|
+
|
|
96
135
|
Returns:
|
|
97
136
|
Dictionary mapping agent IDs to their dependency requirements
|
|
98
137
|
"""
|
|
@@ -106,19 +145,47 @@ class AgentDependencyLoader:
|
|
|
106
145
|
]
|
|
107
146
|
|
|
108
147
|
for agent_id in self.deployed_agents:
|
|
109
|
-
|
|
148
|
+
found = False
|
|
149
|
+
|
|
150
|
+
# Try to find the agent's config (markdown first, then JSON)
|
|
110
151
|
for config_dir in config_paths:
|
|
111
|
-
|
|
112
|
-
|
|
152
|
+
if found:
|
|
153
|
+
break
|
|
154
|
+
|
|
155
|
+
# Try markdown first (current format with YAML frontmatter)
|
|
156
|
+
md_file = config_dir / f"{agent_id}.md"
|
|
157
|
+
if md_file.exists():
|
|
113
158
|
try:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
159
|
+
content = md_file.read_text(encoding="utf-8")
|
|
160
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
161
|
+
if frontmatter and "dependencies" in frontmatter:
|
|
162
|
+
agent_dependencies[agent_id] = frontmatter["dependencies"]
|
|
163
|
+
logger.debug(
|
|
164
|
+
f"Loaded dependencies for {agent_id} from markdown"
|
|
165
|
+
)
|
|
166
|
+
found = True
|
|
167
|
+
break
|
|
120
168
|
except Exception as e:
|
|
121
|
-
logger.warning(f"Failed to load
|
|
169
|
+
logger.warning(f"Failed to load markdown for {agent_id}: {e}")
|
|
170
|
+
|
|
171
|
+
# Fall back to JSON for backward compatibility
|
|
172
|
+
if not found:
|
|
173
|
+
json_file = config_dir / f"{agent_id}.json"
|
|
174
|
+
if json_file.exists():
|
|
175
|
+
try:
|
|
176
|
+
with json_file.open() as f:
|
|
177
|
+
config = json.load(f)
|
|
178
|
+
if "dependencies" in config:
|
|
179
|
+
agent_dependencies[agent_id] = config[
|
|
180
|
+
"dependencies"
|
|
181
|
+
]
|
|
182
|
+
logger.debug(
|
|
183
|
+
f"Loaded dependencies for {agent_id} from JSON"
|
|
184
|
+
)
|
|
185
|
+
found = True
|
|
186
|
+
break
|
|
187
|
+
except Exception as e:
|
|
188
|
+
logger.warning(f"Failed to load JSON for {agent_id}: {e}")
|
|
122
189
|
|
|
123
190
|
self.agent_dependencies = agent_dependencies
|
|
124
191
|
logger.debug(f"Loaded dependencies for {len(agent_dependencies)} agents")
|
|
@@ -678,7 +745,7 @@ class AgentDependencyLoader:
|
|
|
678
745
|
logger.info(
|
|
679
746
|
f"Auto-installing {len(results['summary']['missing_python'])} missing dependencies..."
|
|
680
747
|
)
|
|
681
|
-
success,
|
|
748
|
+
success, _error = self.install_missing_dependencies(
|
|
682
749
|
results["summary"]["missing_python"]
|
|
683
750
|
)
|
|
684
751
|
if success:
|
|
@@ -777,7 +844,7 @@ class AgentDependencyLoader:
|
|
|
777
844
|
import sys
|
|
778
845
|
|
|
779
846
|
if sys.version_info >= (3, 13):
|
|
780
|
-
|
|
847
|
+
_compatible, incompatible = self.check_python_compatibility(
|
|
781
848
|
summary["missing_python"]
|
|
782
849
|
)
|
|
783
850
|
if incompatible:
|
|
@@ -949,7 +1016,7 @@ class AgentDependencyLoader:
|
|
|
949
1016
|
Returns:
|
|
950
1017
|
Cached results or None if not available/valid.
|
|
951
1018
|
"""
|
|
952
|
-
has_changed,
|
|
1019
|
+
has_changed, _current_hash = self.has_agents_changed()
|
|
953
1020
|
|
|
954
1021
|
if not has_changed:
|
|
955
1022
|
state = self.load_deployment_state()
|
|
@@ -333,7 +333,9 @@ class SmartDependencyChecker:
|
|
|
333
333
|
return True, "No valid cache, checking needed"
|
|
334
334
|
|
|
335
335
|
def get_or_check_dependencies(
|
|
336
|
-
self,
|
|
336
|
+
self,
|
|
337
|
+
loader,
|
|
338
|
+
force_check: bool = False, # AgentDependencyLoader instance
|
|
337
339
|
) -> Tuple[Dict, bool]:
|
|
338
340
|
"""
|
|
339
341
|
Get dependency results from cache or perform check.
|