claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -112,9 +112,7 @@ class SystemInstructionsService(BaseService, SystemInstructionsInterface):
|
|
|
112
112
|
self.agent_capabilities_service
|
|
113
113
|
and "{{AGENT_CAPABILITIES}}" in base_pm_content
|
|
114
114
|
):
|
|
115
|
-
capabilities = (
|
|
116
|
-
self.agent_capabilities_service.generate_deployed_agent_capabilities()
|
|
117
|
-
)
|
|
115
|
+
capabilities = self.agent_capabilities_service.generate_deployed_agent_capabilities()
|
|
118
116
|
base_pm_content = base_pm_content.replace(
|
|
119
117
|
"{{AGENT_CAPABILITIES}}", capabilities
|
|
120
118
|
)
|
|
@@ -527,13 +527,11 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
527
527
|
and node.iter.func.id == "range"
|
|
528
528
|
and len(node.iter.args) == 1
|
|
529
529
|
):
|
|
530
|
-
|
|
531
530
|
if isinstance(node.iter.args[0], ast.Call):
|
|
532
531
|
if (
|
|
533
532
|
isinstance(node.iter.args[0].func, ast.Name)
|
|
534
533
|
and node.iter.args[0].func.id == "len"
|
|
535
534
|
):
|
|
536
|
-
|
|
537
535
|
results["optimizations"].append(
|
|
538
536
|
{
|
|
539
537
|
"type": "range_len_pattern",
|
|
@@ -562,7 +560,6 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
562
560
|
"min",
|
|
563
561
|
"max",
|
|
564
562
|
]:
|
|
565
|
-
|
|
566
563
|
results["optimizations"].append(
|
|
567
564
|
{
|
|
568
565
|
"type": "generator_opportunity",
|
|
@@ -17,11 +17,7 @@ from claude_mpm.core.enums import HealthStatus, OperationResult
|
|
|
17
17
|
from claude_mpm.core.logging_utils import get_logger
|
|
18
18
|
from claude_mpm.services.unified.strategies import StrategyMetadata, StrategyPriority
|
|
19
19
|
|
|
20
|
-
from .base import
|
|
21
|
-
DeploymentContext,
|
|
22
|
-
DeploymentResult,
|
|
23
|
-
DeploymentStrategy,
|
|
24
|
-
)
|
|
20
|
+
from .base import DeploymentContext, DeploymentResult, DeploymentStrategy
|
|
25
21
|
|
|
26
22
|
|
|
27
23
|
class VercelDeploymentStrategy(DeploymentStrategy):
|
|
@@ -34,11 +34,7 @@ from .interfaces import (
|
|
|
34
34
|
ServiceCapability,
|
|
35
35
|
ServiceMetadata,
|
|
36
36
|
)
|
|
37
|
-
from .strategies import
|
|
38
|
-
DeploymentStrategy,
|
|
39
|
-
StrategyContext,
|
|
40
|
-
get_strategy_registry,
|
|
41
|
-
)
|
|
37
|
+
from .strategies import DeploymentStrategy, StrategyContext, get_strategy_registry
|
|
42
38
|
|
|
43
39
|
|
|
44
40
|
class UnifiedDeploymentService(IDeploymentService, IUnifiedService):
|
|
@@ -458,17 +458,19 @@ class ConflictResolutionManager:
|
|
|
458
458
|
|
|
459
459
|
for i, marker in enumerate(markers):
|
|
460
460
|
if not marker.ours_content and marker.theirs_content:
|
|
461
|
-
suggestions.append(
|
|
461
|
+
suggestions.append(
|
|
462
|
+
f"Conflict {i + 1}: Accept incoming changes (theirs)"
|
|
463
|
+
)
|
|
462
464
|
elif marker.ours_content and not marker.theirs_content:
|
|
463
|
-
suggestions.append(f"Conflict {i+1}: Keep current changes (ours)")
|
|
465
|
+
suggestions.append(f"Conflict {i + 1}: Keep current changes (ours)")
|
|
464
466
|
elif self._only_whitespace_differences(
|
|
465
467
|
marker.ours_content, marker.theirs_content
|
|
466
468
|
):
|
|
467
469
|
suggestions.append(
|
|
468
|
-
f"Conflict {i+1}: Whitespace differences only - can auto-resolve"
|
|
470
|
+
f"Conflict {i + 1}: Whitespace differences only - can auto-resolve"
|
|
469
471
|
)
|
|
470
472
|
else:
|
|
471
|
-
suggestions.append(f"Conflict {i+1}: Manual merge required")
|
|
473
|
+
suggestions.append(f"Conflict {i + 1}: Manual merge required")
|
|
472
474
|
|
|
473
475
|
return "; ".join(suggestions)
|
|
474
476
|
|
|
@@ -18,6 +18,11 @@ from dataclasses import dataclass, field
|
|
|
18
18
|
from datetime import datetime, timezone
|
|
19
19
|
from typing import Any, Dict, List, Optional
|
|
20
20
|
|
|
21
|
+
# Privileged users who can push directly to main branch
|
|
22
|
+
# All other users must use feature branches and PRs
|
|
23
|
+
PRIVILEGED_GIT_USERS = ["bobmatnyc@users.noreply.github.com"]
|
|
24
|
+
PROTECTED_BRANCHES = ["main", "master"]
|
|
25
|
+
|
|
21
26
|
|
|
22
27
|
@dataclass
|
|
23
28
|
class GitBranchInfo:
|
|
@@ -101,6 +106,94 @@ class GitOperationsManager:
|
|
|
101
106
|
if not self._is_git_repository():
|
|
102
107
|
raise GitOperationError(f"Not a Git repository: {project_root}")
|
|
103
108
|
|
|
109
|
+
def _get_current_git_user(self) -> str:
|
|
110
|
+
"""
|
|
111
|
+
Get the current Git user email.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Git user email configured in repository or globally
|
|
115
|
+
|
|
116
|
+
Raises:
|
|
117
|
+
GitOperationError: If git user.email is not configured
|
|
118
|
+
"""
|
|
119
|
+
try:
|
|
120
|
+
result = self._run_git_command(["config", "user.email"])
|
|
121
|
+
email = result.stdout.strip()
|
|
122
|
+
if not email:
|
|
123
|
+
raise GitOperationError(
|
|
124
|
+
"Git user.email is not configured. "
|
|
125
|
+
"Please configure it with: git config user.email 'your@email.com'"
|
|
126
|
+
)
|
|
127
|
+
return email
|
|
128
|
+
except GitOperationError as e:
|
|
129
|
+
raise GitOperationError(
|
|
130
|
+
"Git user.email is not configured. "
|
|
131
|
+
"Please configure it with: git config user.email 'your@email.com'"
|
|
132
|
+
) from e
|
|
133
|
+
|
|
134
|
+
def _is_privileged_user(self) -> bool:
|
|
135
|
+
"""
|
|
136
|
+
Check if the current Git user is privileged to push to protected branches.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
True if user email is in PRIVILEGED_GIT_USERS, False otherwise
|
|
140
|
+
"""
|
|
141
|
+
try:
|
|
142
|
+
current_user = self._get_current_git_user()
|
|
143
|
+
return current_user in PRIVILEGED_GIT_USERS
|
|
144
|
+
except GitOperationError:
|
|
145
|
+
# If we can't determine user, assume not privileged
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
def _enforce_branch_protection(
|
|
149
|
+
self, target_branch: str, operation: str
|
|
150
|
+
) -> Optional[GitOperationResult]:
|
|
151
|
+
"""
|
|
152
|
+
Enforce branch protection rules for protected branches.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
target_branch: Branch being operated on
|
|
156
|
+
operation: Operation being performed (e.g., "push", "merge")
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
GitOperationResult with error if protection violated, None if allowed
|
|
160
|
+
"""
|
|
161
|
+
# Check if target branch is protected
|
|
162
|
+
if target_branch not in PROTECTED_BRANCHES:
|
|
163
|
+
return None
|
|
164
|
+
|
|
165
|
+
# Check if user is privileged
|
|
166
|
+
if self._is_privileged_user():
|
|
167
|
+
return None
|
|
168
|
+
|
|
169
|
+
# Get current user for error message
|
|
170
|
+
try:
|
|
171
|
+
current_user = self._get_current_git_user()
|
|
172
|
+
except GitOperationError:
|
|
173
|
+
current_user = "unknown"
|
|
174
|
+
|
|
175
|
+
# Build helpful error message
|
|
176
|
+
error_message = (
|
|
177
|
+
f"Direct {operation} to '{target_branch}' branch is restricted.\n"
|
|
178
|
+
f"Only {', '.join(PRIVILEGED_GIT_USERS)} can {operation} directly to protected branches.\n"
|
|
179
|
+
f"Current user: {current_user}\n\n"
|
|
180
|
+
f"Please use the feature branch workflow:\n"
|
|
181
|
+
f" 1. git checkout -b feature/your-feature-name\n"
|
|
182
|
+
f" 2. Make your changes and commit\n"
|
|
183
|
+
f" 3. git push -u origin feature/your-feature-name\n"
|
|
184
|
+
f" 4. Create a Pull Request on GitHub for review"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
return GitOperationResult(
|
|
188
|
+
success=False,
|
|
189
|
+
operation=f"{operation}_branch_protection",
|
|
190
|
+
message=f"Branch protection: {operation} to '{target_branch}' denied",
|
|
191
|
+
error=error_message,
|
|
192
|
+
branch_before=self.get_current_branch(),
|
|
193
|
+
branch_after=self.get_current_branch(),
|
|
194
|
+
execution_time=0.0,
|
|
195
|
+
)
|
|
196
|
+
|
|
104
197
|
def _is_git_repository(self) -> bool:
|
|
105
198
|
"""Check if the directory is a Git repository."""
|
|
106
199
|
return self.git_dir.exists() and self.git_dir.is_dir()
|
|
@@ -503,6 +596,11 @@ class GitOperationsManager:
|
|
|
503
596
|
start_time = datetime.now(timezone.utc)
|
|
504
597
|
current_branch = self.get_current_branch()
|
|
505
598
|
|
|
599
|
+
# Enforce branch protection for target branch
|
|
600
|
+
protection_result = self._enforce_branch_protection(target_branch, "merge")
|
|
601
|
+
if protection_result:
|
|
602
|
+
return protection_result
|
|
603
|
+
|
|
506
604
|
try:
|
|
507
605
|
# Switch to target branch
|
|
508
606
|
if current_branch != target_branch:
|
|
@@ -659,6 +757,11 @@ class GitOperationsManager:
|
|
|
659
757
|
if not branch_name:
|
|
660
758
|
branch_name = current_branch
|
|
661
759
|
|
|
760
|
+
# Enforce branch protection
|
|
761
|
+
protection_result = self._enforce_branch_protection(branch_name, "push")
|
|
762
|
+
if protection_result:
|
|
763
|
+
return protection_result
|
|
764
|
+
|
|
662
765
|
try:
|
|
663
766
|
# Build push command
|
|
664
767
|
push_args = ["push"]
|
|
@@ -6,11 +6,7 @@ This module provides visualization services for code analysis,
|
|
|
6
6
|
including Mermaid diagram generation for various code structures.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
from .mermaid_generator import
|
|
10
|
-
DiagramConfig,
|
|
11
|
-
DiagramType,
|
|
12
|
-
MermaidGeneratorService,
|
|
13
|
-
)
|
|
9
|
+
from .mermaid_generator import DiagramConfig, DiagramType, MermaidGeneratorService
|
|
14
10
|
|
|
15
11
|
__all__ = [
|
|
16
12
|
"DiagramConfig",
|
|
@@ -307,9 +307,8 @@ class MermaidGeneratorService(SyncBaseService):
|
|
|
307
307
|
import_from = imp.get("from", imp.get("module", ""))
|
|
308
308
|
if import_from:
|
|
309
309
|
import_name = self._extract_module_name(import_from)
|
|
310
|
-
if (
|
|
311
|
-
|
|
312
|
-
and self._is_external_module(import_name)
|
|
310
|
+
if not config.include_external and self._is_external_module(
|
|
311
|
+
import_name
|
|
313
312
|
):
|
|
314
313
|
continue
|
|
315
314
|
modules.add(import_name)
|
|
@@ -84,7 +84,7 @@ def main():
|
|
|
84
84
|
try:
|
|
85
85
|
# Start all servers
|
|
86
86
|
for i, server in enumerate(servers):
|
|
87
|
-
print(f"Starting server {i+1}/{len(servers)}: {server['cmd']}")
|
|
87
|
+
print(f"Starting server {i + 1}/{len(servers)}: {server['cmd']}")
|
|
88
88
|
|
|
89
89
|
# Use shell=True to support commands with cd and &&
|
|
90
90
|
process = subprocess.Popen(
|
|
@@ -121,7 +121,7 @@ def main():
|
|
|
121
121
|
except subprocess.TimeoutExpired:
|
|
122
122
|
process.kill()
|
|
123
123
|
process.wait()
|
|
124
|
-
print(f"Server {i+1} stopped")
|
|
124
|
+
print(f"Server {i + 1} stopped")
|
|
125
125
|
print("All servers stopped")
|
|
126
126
|
|
|
127
127
|
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Dict, List, Optional
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
6
|
+
|
|
7
|
+
import yaml
|
|
6
8
|
|
|
7
9
|
from claude_mpm.core.logging_utils import get_logger
|
|
8
10
|
|
|
@@ -56,12 +58,79 @@ class SkillManager:
|
|
|
56
58
|
if mapping_count > 0:
|
|
57
59
|
logger.info(f"Loaded skill mappings for {mapping_count} agents")
|
|
58
60
|
|
|
61
|
+
def _get_pm_skills(self, project_dir: Optional[Path] = None) -> List[Dict[str, Any]]:
|
|
62
|
+
"""Load PM skills from project's .claude-mpm/skills/pm/ directory.
|
|
63
|
+
|
|
64
|
+
PM skills are special required skills deployed per-project,
|
|
65
|
+
NOT fetched from the skills repository.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
project_dir: Project directory. Defaults to current working directory.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
List of PM skill dictionaries with metadata
|
|
72
|
+
"""
|
|
73
|
+
if project_dir is None:
|
|
74
|
+
project_dir = Path.cwd()
|
|
75
|
+
|
|
76
|
+
pm_skills_dir = project_dir / ".claude-mpm" / "skills" / "pm"
|
|
77
|
+
|
|
78
|
+
if not pm_skills_dir.exists():
|
|
79
|
+
logger.debug("PM skills directory not found")
|
|
80
|
+
return []
|
|
81
|
+
|
|
82
|
+
skills = []
|
|
83
|
+
for skill_dir in pm_skills_dir.iterdir():
|
|
84
|
+
if skill_dir.is_dir():
|
|
85
|
+
skill_file = skill_dir / "SKILL.md"
|
|
86
|
+
if skill_file.exists():
|
|
87
|
+
skill = self._load_pm_skill(skill_file)
|
|
88
|
+
if skill:
|
|
89
|
+
skills.append(skill)
|
|
90
|
+
|
|
91
|
+
if skills:
|
|
92
|
+
logger.debug(f"Loaded {len(skills)} PM skills from {pm_skills_dir}")
|
|
93
|
+
|
|
94
|
+
return skills
|
|
95
|
+
|
|
96
|
+
def _load_pm_skill(self, skill_file: Path) -> Optional[Dict[str, Any]]:
|
|
97
|
+
"""Load a single PM skill from SKILL.md file.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
skill_file: Path to SKILL.md file
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
Dictionary with skill metadata and content, or None if failed
|
|
104
|
+
"""
|
|
105
|
+
try:
|
|
106
|
+
content = skill_file.read_text(encoding='utf-8')
|
|
107
|
+
|
|
108
|
+
# Parse YAML frontmatter
|
|
109
|
+
if content.startswith('---'):
|
|
110
|
+
parts = content.split('---', 2)
|
|
111
|
+
if len(parts) >= 3:
|
|
112
|
+
metadata = yaml.safe_load(parts[1])
|
|
113
|
+
body = parts[2].strip()
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
'name': metadata.get('name', skill_file.parent.name),
|
|
117
|
+
'version': metadata.get('version', '1.0.0'),
|
|
118
|
+
'description': metadata.get('description', ''),
|
|
119
|
+
'when_to_use': metadata.get('when_to_use', ''),
|
|
120
|
+
'content': body,
|
|
121
|
+
'is_pm_skill': True
|
|
122
|
+
}
|
|
123
|
+
except Exception as e:
|
|
124
|
+
logger.warning(f"Failed to load PM skill {skill_file}: {e}")
|
|
125
|
+
|
|
126
|
+
return None
|
|
127
|
+
|
|
59
128
|
def get_agent_skills(self, agent_type: str) -> List[Skill]:
|
|
60
129
|
"""
|
|
61
|
-
Get all skills for an agent (bundled + discovered).
|
|
130
|
+
Get all skills for an agent (bundled + discovered + PM skills if PM agent).
|
|
62
131
|
|
|
63
132
|
Args:
|
|
64
|
-
agent_type: Agent type/ID (e.g., 'engineer', 'python_engineer')
|
|
133
|
+
agent_type: Agent type/ID (e.g., 'engineer', 'python_engineer', 'pm')
|
|
65
134
|
|
|
66
135
|
Returns:
|
|
67
136
|
List of Skill objects for this agent
|
|
@@ -86,6 +155,26 @@ class SkillManager:
|
|
|
86
155
|
if skill not in skills:
|
|
87
156
|
skills.append(skill)
|
|
88
157
|
|
|
158
|
+
# Add PM skills for PM agent only
|
|
159
|
+
if agent_type.lower() in ('pm', 'project-manager', 'project_manager'):
|
|
160
|
+
pm_skill_dicts = self._get_pm_skills()
|
|
161
|
+
for pm_skill_dict in pm_skill_dicts:
|
|
162
|
+
# Convert PM skill dict to Skill object
|
|
163
|
+
pm_skill = Skill(
|
|
164
|
+
name=pm_skill_dict['name'],
|
|
165
|
+
path=Path.cwd() / ".claude-mpm" / "skills" / "pm" / pm_skill_dict['name'],
|
|
166
|
+
content=pm_skill_dict['content'],
|
|
167
|
+
source='pm', # Special source type for PM skills
|
|
168
|
+
version=pm_skill_dict['version'],
|
|
169
|
+
skill_id=pm_skill_dict['name'],
|
|
170
|
+
description=pm_skill_dict['description'],
|
|
171
|
+
agent_types=['pm', 'project-manager', 'project_manager']
|
|
172
|
+
)
|
|
173
|
+
skills.append(pm_skill)
|
|
174
|
+
|
|
175
|
+
if pm_skill_dicts:
|
|
176
|
+
logger.debug(f"Added {len(pm_skill_dicts)} PM skills for PM agent")
|
|
177
|
+
|
|
89
178
|
return skills
|
|
90
179
|
|
|
91
180
|
def enhance_agent_prompt(
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Structured question templates for common PM workflows.
|
|
2
|
+
|
|
3
|
+
This package provides reusable question templates that PM agents can use to gather
|
|
4
|
+
user input in a structured way. Templates are pre-configured QuestionSet objects
|
|
5
|
+
that can be customized based on context.
|
|
6
|
+
|
|
7
|
+
Available Templates:
|
|
8
|
+
- PR Strategy: Questions about PR workflow, draft preferences, auto-merge
|
|
9
|
+
- Project Initialization: Questions about project type, language, frameworks
|
|
10
|
+
- Ticket Management: Questions about ticket prioritization and scope
|
|
11
|
+
|
|
12
|
+
Example Usage:
|
|
13
|
+
>>> from claude_mpm.templates.questions.pr_strategy import PRWorkflowTemplate
|
|
14
|
+
>>> template = PRWorkflowTemplate(num_tickets=3)
|
|
15
|
+
>>> question_set = template.build()
|
|
16
|
+
>>> params = question_set.to_ask_user_question_params()
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from claude_mpm.templates.questions.base import ConditionalTemplate, QuestionTemplate
|
|
20
|
+
from claude_mpm.templates.questions.pr_strategy import PRWorkflowTemplate
|
|
21
|
+
from claude_mpm.templates.questions.project_init import (
|
|
22
|
+
DevelopmentWorkflowTemplate,
|
|
23
|
+
ProjectTypeTemplate,
|
|
24
|
+
)
|
|
25
|
+
from claude_mpm.templates.questions.ticket_mgmt import (
|
|
26
|
+
TicketPrioritizationTemplate,
|
|
27
|
+
TicketScopeTemplate,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
"ConditionalTemplate",
|
|
32
|
+
"DevelopmentWorkflowTemplate",
|
|
33
|
+
"PRWorkflowTemplate",
|
|
34
|
+
"ProjectTypeTemplate",
|
|
35
|
+
"QuestionTemplate",
|
|
36
|
+
"TicketPrioritizationTemplate",
|
|
37
|
+
"TicketScopeTemplate",
|
|
38
|
+
]
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"""Base classes for structured question templates.
|
|
2
|
+
|
|
3
|
+
This module provides abstract base classes for creating reusable question templates.
|
|
4
|
+
Templates encapsulate common question patterns and can be context-aware.
|
|
5
|
+
|
|
6
|
+
Design Patterns:
|
|
7
|
+
- Template Method: Define question structure, subclasses provide details
|
|
8
|
+
- Strategy: Different templates for different workflows
|
|
9
|
+
- Factory: Templates build QuestionSet objects
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from abc import ABC, abstractmethod
|
|
15
|
+
from typing import TYPE_CHECKING, Any
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from claude_mpm.utils.structured_questions import QuestionSet
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class QuestionTemplate(ABC):
|
|
22
|
+
"""Abstract base class for question templates.
|
|
23
|
+
|
|
24
|
+
Subclasses should implement the build() method to construct a QuestionSet
|
|
25
|
+
based on template-specific logic and any provided context.
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
>>> class MyTemplate(QuestionTemplate):
|
|
29
|
+
... def build(self) -> QuestionSet:
|
|
30
|
+
... question = QuestionBuilder().ask("...").build()
|
|
31
|
+
... return QuestionSet([question])
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
def build(self) -> QuestionSet:
|
|
36
|
+
"""Build and return a QuestionSet.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
QuestionSet ready for use with AskUserQuestion tool
|
|
40
|
+
|
|
41
|
+
Raises:
|
|
42
|
+
QuestionValidationError: If question construction fails
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def to_params(self) -> dict[str, Any]:
|
|
46
|
+
"""Build question set and convert to AskUserQuestion parameters.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Dictionary suitable for AskUserQuestion tool
|
|
50
|
+
|
|
51
|
+
Raises:
|
|
52
|
+
QuestionValidationError: If question construction fails
|
|
53
|
+
"""
|
|
54
|
+
return self.build().to_ask_user_question_params()
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ConditionalTemplate(QuestionTemplate):
|
|
58
|
+
"""Template that adjusts questions based on context.
|
|
59
|
+
|
|
60
|
+
This base class provides infrastructure for templates that need to vary
|
|
61
|
+
their questions based on runtime context (e.g., number of tickets,
|
|
62
|
+
project type, etc.).
|
|
63
|
+
|
|
64
|
+
Attributes:
|
|
65
|
+
context: Dictionary of context values that affect question selection
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
def __init__(self, **context: Any) -> None:
|
|
69
|
+
"""Initialize with context values.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
**context: Arbitrary context values used to determine questions
|
|
73
|
+
"""
|
|
74
|
+
self.context = context
|
|
75
|
+
|
|
76
|
+
def get_context(self, key: str, default: Any = None) -> Any:
|
|
77
|
+
"""Get a context value.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
key: Context key to retrieve
|
|
81
|
+
default: Default value if key not found
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
Context value or default
|
|
85
|
+
"""
|
|
86
|
+
return self.context.get(key, default)
|
|
87
|
+
|
|
88
|
+
def has_context(self, key: str) -> bool:
|
|
89
|
+
"""Check if context key exists.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
key: Context key to check
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
True if key exists in context, False otherwise
|
|
96
|
+
"""
|
|
97
|
+
return key in self.context
|
|
98
|
+
|
|
99
|
+
def should_include_question(self, question_id: str) -> bool:
|
|
100
|
+
"""Determine if a question should be included based on context.
|
|
101
|
+
|
|
102
|
+
Subclasses can override this to implement conditional logic.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
question_id: Identifier for the question being considered
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
True if question should be included, False otherwise
|
|
109
|
+
"""
|
|
110
|
+
return True
|
|
111
|
+
|
|
112
|
+
@abstractmethod
|
|
113
|
+
def build(self) -> QuestionSet:
|
|
114
|
+
"""Build QuestionSet based on context.
|
|
115
|
+
|
|
116
|
+
Subclasses must implement this to create context-aware questions.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
QuestionSet with questions appropriate for the context
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class MultiStepTemplate(QuestionTemplate):
|
|
124
|
+
"""Template for multi-step question workflows.
|
|
125
|
+
|
|
126
|
+
Some workflows require multiple rounds of questions, where later questions
|
|
127
|
+
depend on answers to earlier ones. This base class provides infrastructure
|
|
128
|
+
for such workflows.
|
|
129
|
+
|
|
130
|
+
Note: Initial implementation focuses on single-step templates. This class
|
|
131
|
+
is provided for future extensibility.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
def __init__(self) -> None:
|
|
135
|
+
"""Initialize multi-step template."""
|
|
136
|
+
self._current_step = 0
|
|
137
|
+
self._answers: dict[str, Any] = {}
|
|
138
|
+
|
|
139
|
+
def set_answers(self, step: int, answers: dict[str, Any]) -> None:
|
|
140
|
+
"""Record answers from a previous step.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
step: Step number (0-indexed)
|
|
144
|
+
answers: Parsed answers from ResponseParser
|
|
145
|
+
"""
|
|
146
|
+
self._answers[str(step)] = answers
|
|
147
|
+
|
|
148
|
+
def get_answers(self, step: int) -> dict[str, Any] | None:
|
|
149
|
+
"""Get answers from a previous step.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
step: Step number (0-indexed)
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Answers dictionary or None if step not completed
|
|
156
|
+
"""
|
|
157
|
+
return self._answers.get(str(step))
|
|
158
|
+
|
|
159
|
+
@abstractmethod
|
|
160
|
+
def build_step(self, step: int) -> QuestionSet:
|
|
161
|
+
"""Build questions for a specific step.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
step: Step number (0-indexed)
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
QuestionSet for the specified step
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
def build(self) -> QuestionSet:
|
|
171
|
+
"""Build questions for the current step.
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
QuestionSet for current step
|
|
175
|
+
"""
|
|
176
|
+
return self.build_step(self._current_step)
|
|
177
|
+
|
|
178
|
+
def advance_step(self) -> None:
|
|
179
|
+
"""Move to the next step."""
|
|
180
|
+
self._current_step += 1
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def current_step(self) -> int:
|
|
184
|
+
"""Get current step number."""
|
|
185
|
+
return self._current_step
|
|
186
|
+
|
|
187
|
+
@abstractmethod
|
|
188
|
+
def is_complete(self) -> bool:
|
|
189
|
+
"""Check if all steps are complete.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
True if workflow is complete, False otherwise
|
|
193
|
+
"""
|