claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Postmortem command implementation for claude-mpm.
|
|
3
|
+
|
|
4
|
+
WHY: Provide a comprehensive analysis tool to help users identify, categorize,
|
|
5
|
+
and fix errors encountered during their session, with automated improvements
|
|
6
|
+
for framework code and suggestions for user code.
|
|
7
|
+
|
|
8
|
+
DESIGN DECISIONS:
|
|
9
|
+
- Leverages existing FailureTracker for error data
|
|
10
|
+
- Categorizes errors by source (script/skill/agent/user)
|
|
11
|
+
- Provides action-specific handling (auto-fix/update/PR/suggest)
|
|
12
|
+
- Supports dry-run mode for safety
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
19
|
+
from claude_mpm.services.analysis import get_postmortem_service
|
|
20
|
+
from claude_mpm.services.analysis.postmortem_reporter import PostmortemReporter
|
|
21
|
+
|
|
22
|
+
logger = get_logger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def add_postmortem_parser(subparsers):
|
|
26
|
+
"""Add postmortem command parser.
|
|
27
|
+
|
|
28
|
+
WHY: This command helps users analyze session errors and generate
|
|
29
|
+
actionable improvement suggestions based on error source.
|
|
30
|
+
"""
|
|
31
|
+
parser = subparsers.add_parser(
|
|
32
|
+
"postmortem",
|
|
33
|
+
aliases=["pm-analysis"],
|
|
34
|
+
help="Analyze session errors and suggest improvements",
|
|
35
|
+
description="Perform comprehensive analysis of errors encountered during the session",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
"--dry-run",
|
|
40
|
+
action="store_true",
|
|
41
|
+
help="Preview analysis without making changes (default for destructive operations)",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
parser.add_argument(
|
|
45
|
+
"--auto-fix",
|
|
46
|
+
action="store_true",
|
|
47
|
+
help="Automatically apply fixes to scripts and skills",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
parser.add_argument(
|
|
51
|
+
"--create-prs",
|
|
52
|
+
action="store_true",
|
|
53
|
+
help="Create pull requests for agent improvements",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
parser.add_argument(
|
|
57
|
+
"--session-id",
|
|
58
|
+
type=str,
|
|
59
|
+
help="Analyze specific session (default: current session)",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
parser.add_argument(
|
|
63
|
+
"--format",
|
|
64
|
+
choices=["terminal", "json", "markdown"],
|
|
65
|
+
default="terminal",
|
|
66
|
+
help="Output format (default: terminal)",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
parser.add_argument(
|
|
70
|
+
"--output",
|
|
71
|
+
"-o",
|
|
72
|
+
type=Path,
|
|
73
|
+
help="Save report to file",
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
parser.add_argument(
|
|
77
|
+
"--verbose",
|
|
78
|
+
"-v",
|
|
79
|
+
action="store_true",
|
|
80
|
+
help="Include detailed error traces and analysis",
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
parser.add_argument(
|
|
84
|
+
"--no-color",
|
|
85
|
+
action="store_true",
|
|
86
|
+
help="Disable colored output",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
parser.set_defaults(func=postmortem_command)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def run_postmortem(args):
|
|
93
|
+
"""Main entry point for postmortem command (used by CLI).
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
args: Parsed command-line arguments
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Exit code (0 for success, 1 for warnings, 2 for errors)
|
|
100
|
+
"""
|
|
101
|
+
return postmortem_command(args)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def postmortem_command(args):
|
|
105
|
+
"""Execute the postmortem command.
|
|
106
|
+
|
|
107
|
+
WHY: Provides comprehensive error analysis with categorization and
|
|
108
|
+
actionable improvements, helping users understand and fix issues
|
|
109
|
+
encountered during their session.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
args: Parsed command-line arguments
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Exit code (0 for success, 1 for warnings, 2 for errors)
|
|
116
|
+
"""
|
|
117
|
+
logger.info("Starting postmortem analysis")
|
|
118
|
+
|
|
119
|
+
# Get postmortem service
|
|
120
|
+
service = get_postmortem_service()
|
|
121
|
+
|
|
122
|
+
try:
|
|
123
|
+
# Analyze session
|
|
124
|
+
report = service.analyze_session(session_id=args.session_id)
|
|
125
|
+
|
|
126
|
+
# Handle output file
|
|
127
|
+
output_file = args.output
|
|
128
|
+
if output_file:
|
|
129
|
+
# Ensure file extension matches format
|
|
130
|
+
if args.format == "json" and not str(output_file).endswith(".json"):
|
|
131
|
+
output_file = Path(str(output_file) + ".json")
|
|
132
|
+
elif args.format == "markdown" and not str(output_file).endswith(".md"):
|
|
133
|
+
output_file = Path(str(output_file) + ".md")
|
|
134
|
+
|
|
135
|
+
# Create parent directories
|
|
136
|
+
output_file = output_file.absolute()
|
|
137
|
+
output_file.parent.mkdir(parents=True, exist_ok=True)
|
|
138
|
+
|
|
139
|
+
# Determine output format
|
|
140
|
+
output_format = args.format
|
|
141
|
+
|
|
142
|
+
# Create reporter
|
|
143
|
+
reporter = PostmortemReporter(
|
|
144
|
+
use_color=not args.no_color,
|
|
145
|
+
verbose=args.verbose,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Output results
|
|
149
|
+
if output_file:
|
|
150
|
+
# Save to file
|
|
151
|
+
try:
|
|
152
|
+
with output_file.open("w") as f:
|
|
153
|
+
original_output = reporter.output
|
|
154
|
+
reporter.output = f
|
|
155
|
+
reporter.report(report, format=output_format)
|
|
156
|
+
reporter.output = original_output
|
|
157
|
+
|
|
158
|
+
print(f"✅ Report saved to: {output_file}")
|
|
159
|
+
|
|
160
|
+
# Print brief summary to terminal
|
|
161
|
+
if report.total_errors > 0:
|
|
162
|
+
print(f"\n{report.total_errors} error(s) analyzed")
|
|
163
|
+
print(
|
|
164
|
+
f"{report.stats['total_actions']} improvement action(s) generated"
|
|
165
|
+
)
|
|
166
|
+
else:
|
|
167
|
+
print("\n✅ No errors detected in session!")
|
|
168
|
+
|
|
169
|
+
except Exception as e:
|
|
170
|
+
logger.error(f"Failed to save report: {e}")
|
|
171
|
+
print(f"❌ Failed to save report: {e!s}")
|
|
172
|
+
# Still output to terminal
|
|
173
|
+
reporter.report(report, format="terminal")
|
|
174
|
+
else:
|
|
175
|
+
# Output to terminal
|
|
176
|
+
reporter.report(report, format=output_format)
|
|
177
|
+
|
|
178
|
+
# Apply fixes if requested
|
|
179
|
+
if args.auto_fix and not args.dry_run:
|
|
180
|
+
exit_code = _apply_auto_fixes(report, args.verbose)
|
|
181
|
+
if exit_code != 0:
|
|
182
|
+
return exit_code
|
|
183
|
+
|
|
184
|
+
# Create PRs if requested
|
|
185
|
+
if args.create_prs and not args.dry_run:
|
|
186
|
+
exit_code = _create_prs(report, args.verbose)
|
|
187
|
+
if exit_code != 0:
|
|
188
|
+
return exit_code
|
|
189
|
+
|
|
190
|
+
# Dry-run message
|
|
191
|
+
if args.dry_run and (args.auto_fix or args.create_prs):
|
|
192
|
+
print("\n🔍 Dry-run mode: No changes applied")
|
|
193
|
+
print(" Remove --dry-run to apply changes")
|
|
194
|
+
|
|
195
|
+
# Determine exit code
|
|
196
|
+
if report.total_errors == 0:
|
|
197
|
+
return 0 # No errors
|
|
198
|
+
|
|
199
|
+
if report.stats.get("critical_priority", 0) > 0:
|
|
200
|
+
return 2 # Critical errors found
|
|
201
|
+
|
|
202
|
+
return 1 # Non-critical errors found
|
|
203
|
+
|
|
204
|
+
except KeyboardInterrupt:
|
|
205
|
+
print("\nPostmortem analysis interrupted by user")
|
|
206
|
+
return 130
|
|
207
|
+
|
|
208
|
+
except Exception as e:
|
|
209
|
+
logger.error(f"Postmortem analysis failed: {e}", exc_info=True)
|
|
210
|
+
print(f"\n❌ Postmortem analysis failed: {e!s}")
|
|
211
|
+
if args.verbose:
|
|
212
|
+
import traceback
|
|
213
|
+
|
|
214
|
+
traceback.print_exc()
|
|
215
|
+
return 2
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _apply_auto_fixes(report, verbose: bool) -> int:
|
|
219
|
+
"""Apply auto-fix actions from report.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
report: Postmortem report
|
|
223
|
+
verbose: Show detailed output
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
Exit code (0 for success, non-zero for errors)
|
|
227
|
+
"""
|
|
228
|
+
from claude_mpm.services.analysis import ActionType
|
|
229
|
+
|
|
230
|
+
auto_fix_actions = report.get_actions_by_type(ActionType.AUTO_FIX)
|
|
231
|
+
|
|
232
|
+
if not auto_fix_actions:
|
|
233
|
+
print("\n✅ No auto-fixable errors found")
|
|
234
|
+
return 0
|
|
235
|
+
|
|
236
|
+
print(f"\n🔧 Applying {len(auto_fix_actions)} auto-fix action(s)...")
|
|
237
|
+
|
|
238
|
+
import subprocess
|
|
239
|
+
|
|
240
|
+
success_count = 0
|
|
241
|
+
fail_count = 0
|
|
242
|
+
|
|
243
|
+
for i, action in enumerate(auto_fix_actions, 1):
|
|
244
|
+
print(f"\n[{i}/{len(auto_fix_actions)}] {action.description}")
|
|
245
|
+
|
|
246
|
+
# Run each command
|
|
247
|
+
for cmd in action.commands:
|
|
248
|
+
if verbose:
|
|
249
|
+
print(f" Running: {cmd}")
|
|
250
|
+
|
|
251
|
+
try:
|
|
252
|
+
result = subprocess.run(
|
|
253
|
+
cmd,
|
|
254
|
+
check=False,
|
|
255
|
+
shell=True,
|
|
256
|
+
capture_output=True,
|
|
257
|
+
text=True,
|
|
258
|
+
timeout=30,
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
if result.returncode == 0:
|
|
262
|
+
action.status = "completed"
|
|
263
|
+
if verbose:
|
|
264
|
+
print(f" ✅ Success: {cmd}")
|
|
265
|
+
else:
|
|
266
|
+
action.status = "failed"
|
|
267
|
+
action.error_message = result.stderr or result.stdout
|
|
268
|
+
print(f" ❌ Failed: {cmd}")
|
|
269
|
+
if verbose and result.stderr:
|
|
270
|
+
print(f" {result.stderr}")
|
|
271
|
+
fail_count += 1
|
|
272
|
+
break # Stop on first failure for this action
|
|
273
|
+
|
|
274
|
+
except subprocess.TimeoutExpired:
|
|
275
|
+
action.status = "failed"
|
|
276
|
+
action.error_message = "Command timed out"
|
|
277
|
+
print(f" ❌ Timeout: {cmd}")
|
|
278
|
+
fail_count += 1
|
|
279
|
+
break
|
|
280
|
+
|
|
281
|
+
except Exception as e:
|
|
282
|
+
action.status = "failed"
|
|
283
|
+
action.error_message = str(e)
|
|
284
|
+
print(f" ❌ Error: {e}")
|
|
285
|
+
fail_count += 1
|
|
286
|
+
break
|
|
287
|
+
|
|
288
|
+
if action.status == "completed":
|
|
289
|
+
success_count += 1
|
|
290
|
+
|
|
291
|
+
# Summary
|
|
292
|
+
print("\n📊 Auto-fix Results:")
|
|
293
|
+
print(f" ✅ Successful: {success_count}")
|
|
294
|
+
print(f" ❌ Failed: {fail_count}")
|
|
295
|
+
|
|
296
|
+
return 0 if fail_count == 0 else 1
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def _create_prs(report, verbose: bool) -> int:
|
|
300
|
+
"""Create PRs for agent improvements.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
report: Postmortem report
|
|
304
|
+
verbose: Show detailed output
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
Exit code (0 for success, non-zero for errors)
|
|
308
|
+
"""
|
|
309
|
+
from claude_mpm.services.analysis import ActionType
|
|
310
|
+
|
|
311
|
+
pr_actions = report.get_actions_by_type(ActionType.CREATE_PR)
|
|
312
|
+
|
|
313
|
+
if not pr_actions:
|
|
314
|
+
print("\n✅ No PR actions needed")
|
|
315
|
+
return 0
|
|
316
|
+
|
|
317
|
+
print(f"\n🤖 Creating {len(pr_actions)} PR(s) for agent improvements...")
|
|
318
|
+
|
|
319
|
+
# Check if we're in the agent cache git repo
|
|
320
|
+
agent_cache_path = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
321
|
+
|
|
322
|
+
if not agent_cache_path.exists():
|
|
323
|
+
print(f"❌ Agent cache not found at: {agent_cache_path}")
|
|
324
|
+
print(" Run 'claude-mpm agents sync' first")
|
|
325
|
+
return 2
|
|
326
|
+
|
|
327
|
+
success_count = 0
|
|
328
|
+
fail_count = 0
|
|
329
|
+
|
|
330
|
+
for i, action in enumerate(pr_actions, 1):
|
|
331
|
+
print(f"\n[{i}/{len(pr_actions)}] {action.description}")
|
|
332
|
+
|
|
333
|
+
try:
|
|
334
|
+
# Check if file is in agent cache
|
|
335
|
+
analysis = action.error_analysis
|
|
336
|
+
if not analysis.affected_file:
|
|
337
|
+
print(" ⚠️ Cannot determine affected file, skipping")
|
|
338
|
+
action.status = "failed"
|
|
339
|
+
action.error_message = "No affected file identified"
|
|
340
|
+
fail_count += 1
|
|
341
|
+
continue
|
|
342
|
+
|
|
343
|
+
# For MVP, print PR template instead of actually creating
|
|
344
|
+
# Full implementation would use GitHub CLI or API
|
|
345
|
+
print(" 📝 PR Template Generated:")
|
|
346
|
+
print(f" Branch: {action.pr_branch}")
|
|
347
|
+
print(f" Title: {action.pr_title}")
|
|
348
|
+
|
|
349
|
+
if verbose:
|
|
350
|
+
print("\n--- PR Body ---")
|
|
351
|
+
print(action.pr_body)
|
|
352
|
+
print("--- End PR Body ---\n")
|
|
353
|
+
|
|
354
|
+
print("\n ℹ️ To create PR manually:")
|
|
355
|
+
print(f" cd {agent_cache_path}")
|
|
356
|
+
print(f" git checkout -b {action.pr_branch}")
|
|
357
|
+
print(f" # Make your changes to {analysis.affected_file}")
|
|
358
|
+
print(f" git add {analysis.affected_file}")
|
|
359
|
+
print(f' git commit -m "{action.pr_title}"')
|
|
360
|
+
print(f" git push origin {action.pr_branch}")
|
|
361
|
+
print(
|
|
362
|
+
f' gh pr create --title "{action.pr_title}" --body-file pr_body.md'
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
action.status = "completed"
|
|
366
|
+
success_count += 1
|
|
367
|
+
|
|
368
|
+
except Exception as e:
|
|
369
|
+
logger.error(f"Failed to create PR: {e}")
|
|
370
|
+
print(f" ❌ Error: {e}")
|
|
371
|
+
action.status = "failed"
|
|
372
|
+
action.error_message = str(e)
|
|
373
|
+
fail_count += 1
|
|
374
|
+
|
|
375
|
+
# Summary
|
|
376
|
+
print("\n📊 PR Creation Results:")
|
|
377
|
+
print(f" ✅ Templates generated: {success_count}")
|
|
378
|
+
print(f" ❌ Failed: {fail_count}")
|
|
379
|
+
|
|
380
|
+
return 0 if fail_count == 0 else 1
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
# Optional: Standalone execution for testing
|
|
384
|
+
if __name__ == "__main__":
|
|
385
|
+
import argparse
|
|
386
|
+
|
|
387
|
+
parser = argparse.ArgumentParser(description="Claude MPM Postmortem Analysis")
|
|
388
|
+
parser.add_argument("--dry-run", action="store_true")
|
|
389
|
+
parser.add_argument("--auto-fix", action="store_true")
|
|
390
|
+
parser.add_argument("--create-prs", action="store_true")
|
|
391
|
+
parser.add_argument("--session-id", type=str)
|
|
392
|
+
parser.add_argument(
|
|
393
|
+
"--format", choices=["terminal", "json", "markdown"], default="terminal"
|
|
394
|
+
)
|
|
395
|
+
parser.add_argument("--output", "-o", type=Path)
|
|
396
|
+
parser.add_argument("--verbose", "-v", action="store_true")
|
|
397
|
+
parser.add_argument("--no-color", action="store_true")
|
|
398
|
+
|
|
399
|
+
args = parser.parse_args()
|
|
400
|
+
|
|
401
|
+
sys.exit(postmortem_command(args))
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Profile management commands for claude-mpm CLI.
|
|
3
|
+
|
|
4
|
+
WHY: Users need a simple way to manage deployment profiles from the command
|
|
5
|
+
line. Profiles control which agents and skills are deployed, reducing context
|
|
6
|
+
usage by limiting available agents to only what's needed.
|
|
7
|
+
|
|
8
|
+
DESIGN DECISIONS:
|
|
9
|
+
- Use BaseCommand for consistent CLI patterns
|
|
10
|
+
- Provide clear, actionable output with standardized error handling
|
|
11
|
+
- Support profile listing, activation, and status reporting
|
|
12
|
+
- Integrate with ConfigLoader for profile persistence
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, Dict
|
|
17
|
+
|
|
18
|
+
import yaml
|
|
19
|
+
from rich.console import Console
|
|
20
|
+
from rich.table import Table
|
|
21
|
+
|
|
22
|
+
from ...core.shared.config_loader import ConfigLoader
|
|
23
|
+
from ...services.profile_manager import ProfileManager
|
|
24
|
+
from ...utils.console import console
|
|
25
|
+
from ..shared import BaseCommand, CommandResult
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ProfileCommand(BaseCommand):
|
|
29
|
+
"""Profile management command for agents and skills filtering."""
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
super().__init__("profile")
|
|
33
|
+
# ProfileManager will auto-detect project directory
|
|
34
|
+
self.profile_manager = ProfileManager()
|
|
35
|
+
self.config_loader = ConfigLoader()
|
|
36
|
+
|
|
37
|
+
def validate_args(self, args) -> str:
|
|
38
|
+
"""Validate command arguments."""
|
|
39
|
+
if not hasattr(args, "profile_command") or not args.profile_command:
|
|
40
|
+
return "Profile command required. Use: list, set, status, or show"
|
|
41
|
+
|
|
42
|
+
valid_commands = ["list", "set", "status", "show"]
|
|
43
|
+
if args.profile_command not in valid_commands:
|
|
44
|
+
return (
|
|
45
|
+
f"Unknown profile command: {args.profile_command}. "
|
|
46
|
+
f"Valid commands: {', '.join(valid_commands)}"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Validate set command has profile name
|
|
50
|
+
if args.profile_command == "set":
|
|
51
|
+
if not hasattr(args, "profile_name") or not args.profile_name:
|
|
52
|
+
return "Profile name required for 'set' command"
|
|
53
|
+
|
|
54
|
+
# Validate show command has profile name
|
|
55
|
+
if args.profile_command == "show":
|
|
56
|
+
if not hasattr(args, "profile_name") or not args.profile_name:
|
|
57
|
+
return "Profile name required for 'show' command"
|
|
58
|
+
|
|
59
|
+
return None
|
|
60
|
+
|
|
61
|
+
def run(self, args) -> CommandResult:
|
|
62
|
+
"""Execute the profile command."""
|
|
63
|
+
try:
|
|
64
|
+
if args.profile_command == "list":
|
|
65
|
+
return self._list_profiles(args)
|
|
66
|
+
elif args.profile_command == "set":
|
|
67
|
+
return self._set_profile(args)
|
|
68
|
+
elif args.profile_command == "status":
|
|
69
|
+
return self._show_status(args)
|
|
70
|
+
elif args.profile_command == "show":
|
|
71
|
+
return self._show_profile(args)
|
|
72
|
+
else:
|
|
73
|
+
return CommandResult.error_result(
|
|
74
|
+
f"Unknown profile command: {args.profile_command}"
|
|
75
|
+
)
|
|
76
|
+
except Exception as e:
|
|
77
|
+
return CommandResult.error_result(f"Profile command failed: {e}")
|
|
78
|
+
|
|
79
|
+
def _list_profiles(self, args) -> CommandResult:
|
|
80
|
+
"""List all available profiles."""
|
|
81
|
+
profiles = self.profile_manager.list_available_profiles()
|
|
82
|
+
|
|
83
|
+
if not profiles:
|
|
84
|
+
console.print("[yellow]No profiles found in .claude-mpm/profiles/[/yellow]")
|
|
85
|
+
return CommandResult.success_result("No profiles available")
|
|
86
|
+
|
|
87
|
+
# Load current active profile
|
|
88
|
+
main_config = self.config_loader.load_main_config()
|
|
89
|
+
active_profile = main_config.get("active_profile")
|
|
90
|
+
|
|
91
|
+
# Create table
|
|
92
|
+
table = Table(title="Available Deployment Profiles")
|
|
93
|
+
table.add_column("Profile", style="cyan", no_wrap=True)
|
|
94
|
+
table.add_column("Description", style="white")
|
|
95
|
+
table.add_column("Status", style="green")
|
|
96
|
+
|
|
97
|
+
for profile_name in profiles:
|
|
98
|
+
description = self.profile_manager.get_profile_description(profile_name)
|
|
99
|
+
status = "✓ Active" if profile_name == active_profile else ""
|
|
100
|
+
|
|
101
|
+
table.add_row(
|
|
102
|
+
profile_name, description or "(no description)", status or "-"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
console.print(table)
|
|
106
|
+
|
|
107
|
+
return CommandResult.success_result(
|
|
108
|
+
f"Found {len(profiles)} profile(s)", {"profiles": profiles}
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
def _set_profile(self, args) -> CommandResult:
|
|
112
|
+
"""Set active profile."""
|
|
113
|
+
profile_name = args.profile_name
|
|
114
|
+
|
|
115
|
+
# Validate profile exists
|
|
116
|
+
available_profiles = self.profile_manager.list_available_profiles()
|
|
117
|
+
if profile_name not in available_profiles:
|
|
118
|
+
return CommandResult.error_result(
|
|
119
|
+
f"Profile '{profile_name}' not found. "
|
|
120
|
+
f"Available profiles: {', '.join(available_profiles)}"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# Load profile to validate it
|
|
124
|
+
success = self.profile_manager.load_profile(profile_name)
|
|
125
|
+
if not success:
|
|
126
|
+
return CommandResult.error_result(
|
|
127
|
+
f"Failed to load profile '{profile_name}'"
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
# Update configuration.yaml
|
|
131
|
+
config_path = Path.cwd() / ".claude-mpm" / "configuration.yaml"
|
|
132
|
+
if not config_path.exists():
|
|
133
|
+
# Create configuration.yaml if it doesn't exist
|
|
134
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
135
|
+
config_data = {"active_profile": profile_name}
|
|
136
|
+
else:
|
|
137
|
+
# Load existing configuration
|
|
138
|
+
with config_path.open("r") as f:
|
|
139
|
+
config_data = yaml.safe_load(f) or {}
|
|
140
|
+
config_data["active_profile"] = profile_name
|
|
141
|
+
|
|
142
|
+
# Save configuration
|
|
143
|
+
with config_path.open("w") as f:
|
|
144
|
+
yaml.safe_dump(config_data, f, default_flow_style=False, sort_keys=False)
|
|
145
|
+
|
|
146
|
+
# Show summary
|
|
147
|
+
summary = self.profile_manager.get_filtering_summary()
|
|
148
|
+
console.print(f"[green]✓[/green] Active profile set to: [cyan]{profile_name}[/cyan]")
|
|
149
|
+
console.print(
|
|
150
|
+
f" Agents enabled: [cyan]{summary['enabled_agents_count']}[/cyan]"
|
|
151
|
+
)
|
|
152
|
+
console.print(
|
|
153
|
+
f" Skills enabled: [cyan]{summary['enabled_skills_count']}[/cyan]"
|
|
154
|
+
)
|
|
155
|
+
console.print(
|
|
156
|
+
f" Skill patterns disabled: [cyan]{summary['disabled_patterns_count']}[/cyan]"
|
|
157
|
+
)
|
|
158
|
+
console.print(
|
|
159
|
+
"\n[yellow]Note:[/yellow] Restart Claude Code or run [cyan]claude-mpm init[/cyan] "
|
|
160
|
+
"to apply profile filtering."
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
return CommandResult.success_result(
|
|
164
|
+
f"Profile '{profile_name}' activated",
|
|
165
|
+
{"profile": profile_name, "summary": summary},
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
def _show_status(self, args) -> CommandResult:
|
|
169
|
+
"""Show current profile status."""
|
|
170
|
+
# Load current active profile
|
|
171
|
+
main_config = self.config_loader.load_main_config()
|
|
172
|
+
active_profile = main_config.get("active_profile")
|
|
173
|
+
|
|
174
|
+
if not active_profile:
|
|
175
|
+
console.print(
|
|
176
|
+
"[yellow]No active profile[/yellow] - All agents and skills enabled"
|
|
177
|
+
)
|
|
178
|
+
return CommandResult.success_result(
|
|
179
|
+
"No active profile", {"active_profile": None}
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# Load profile
|
|
183
|
+
success = self.profile_manager.load_profile(active_profile)
|
|
184
|
+
if not success:
|
|
185
|
+
return CommandResult.error_result(
|
|
186
|
+
f"Failed to load active profile '{active_profile}'"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# Get summary
|
|
190
|
+
summary = self.profile_manager.get_filtering_summary()
|
|
191
|
+
|
|
192
|
+
# Display status
|
|
193
|
+
console.print(f"[green]Active Profile:[/green] [cyan]{active_profile}[/cyan]")
|
|
194
|
+
console.print()
|
|
195
|
+
|
|
196
|
+
# Agents section
|
|
197
|
+
console.print("[bold]Agents:[/bold]")
|
|
198
|
+
console.print(f" Enabled: [cyan]{summary['enabled_agents_count']}[/cyan]")
|
|
199
|
+
console.print(f" Disabled: [cyan]{summary['disabled_agents_count']}[/cyan]")
|
|
200
|
+
|
|
201
|
+
# Skills section
|
|
202
|
+
console.print()
|
|
203
|
+
console.print("[bold]Skills:[/bold]")
|
|
204
|
+
console.print(f" Enabled: [cyan]{summary['enabled_skills_count']}[/cyan]")
|
|
205
|
+
console.print(
|
|
206
|
+
f" Disabled patterns: [cyan]{summary['disabled_patterns_count']}[/cyan]"
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
return CommandResult.success_result(
|
|
210
|
+
f"Profile '{active_profile}' status",
|
|
211
|
+
{"active_profile": active_profile, "summary": summary},
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
def _show_profile(self, args) -> CommandResult:
|
|
215
|
+
"""Show detailed profile configuration."""
|
|
216
|
+
profile_name = args.profile_name
|
|
217
|
+
|
|
218
|
+
# Validate profile exists
|
|
219
|
+
available_profiles = self.profile_manager.list_available_profiles()
|
|
220
|
+
if profile_name not in available_profiles:
|
|
221
|
+
return CommandResult.error_result(
|
|
222
|
+
f"Profile '{profile_name}' not found. "
|
|
223
|
+
f"Available profiles: {', '.join(available_profiles)}"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Load profile
|
|
227
|
+
success = self.profile_manager.load_profile(profile_name)
|
|
228
|
+
if not success:
|
|
229
|
+
return CommandResult.error_result(
|
|
230
|
+
f"Failed to load profile '{profile_name}'"
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
# Display profile details
|
|
234
|
+
console.print(f"[bold]Profile:[/bold] [cyan]{profile_name}[/cyan]")
|
|
235
|
+
console.print()
|
|
236
|
+
|
|
237
|
+
# Show enabled agents
|
|
238
|
+
enabled_agents = self.profile_manager.get_enabled_agents()
|
|
239
|
+
if enabled_agents:
|
|
240
|
+
console.print("[bold]Enabled Agents:[/bold]")
|
|
241
|
+
for agent in sorted(enabled_agents):
|
|
242
|
+
console.print(f" • {agent}")
|
|
243
|
+
console.print()
|
|
244
|
+
|
|
245
|
+
# Show disabled agents
|
|
246
|
+
disabled_agents = self.profile_manager.get_disabled_agents()
|
|
247
|
+
if disabled_agents:
|
|
248
|
+
console.print("[bold]Disabled Agents:[/bold]")
|
|
249
|
+
for agent in sorted(disabled_agents):
|
|
250
|
+
console.print(f" • {agent}")
|
|
251
|
+
console.print()
|
|
252
|
+
|
|
253
|
+
# Show enabled skills
|
|
254
|
+
enabled_skills = self.profile_manager.get_enabled_skills()
|
|
255
|
+
if enabled_skills:
|
|
256
|
+
console.print("[bold]Enabled Skills:[/bold]")
|
|
257
|
+
for skill in sorted(enabled_skills):
|
|
258
|
+
console.print(f" • {skill}")
|
|
259
|
+
console.print()
|
|
260
|
+
|
|
261
|
+
# Show disabled skill patterns
|
|
262
|
+
disabled_patterns = self.profile_manager.get_disabled_skill_patterns()
|
|
263
|
+
if disabled_patterns:
|
|
264
|
+
console.print("[bold]Disabled Skill Patterns:[/bold]")
|
|
265
|
+
for pattern in disabled_patterns:
|
|
266
|
+
console.print(f" • {pattern}")
|
|
267
|
+
|
|
268
|
+
return CommandResult.success_result(
|
|
269
|
+
f"Profile '{profile_name}' details",
|
|
270
|
+
{
|
|
271
|
+
"profile": profile_name,
|
|
272
|
+
"enabled_agents": list(enabled_agents),
|
|
273
|
+
"disabled_agents": list(disabled_agents),
|
|
274
|
+
"enabled_skills": list(enabled_skills),
|
|
275
|
+
"disabled_patterns": disabled_patterns,
|
|
276
|
+
},
|
|
277
|
+
)
|