claude-mpm 4.24.0__py3-none-any.whl → 5.0.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +721 -911
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +4 -4
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +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 +38 -2
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +188 -30
- claude_mpm/cli/commands/agents.py +959 -36
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +2 -6
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +769 -45
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +49 -1
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +757 -20
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +955 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +256 -4
- claude_mpm/cli/parsers/base_parser.py +53 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +145 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +538 -106
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +14 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +16 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/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 +3 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +200 -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 +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/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 +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/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_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +29 -9
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +77 -10
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +2 -4
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
- 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/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/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,765 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Postmortem Analysis Service
|
|
4
|
+
============================
|
|
5
|
+
|
|
6
|
+
Analyzes session errors and suggests improvements across different code categories:
|
|
7
|
+
- Scripts: Test and fix in place
|
|
8
|
+
- Skills: Update skill files
|
|
9
|
+
- MPM Agents: Prepare PRs for remote repository
|
|
10
|
+
- User Code: Suggest only (no modification)
|
|
11
|
+
|
|
12
|
+
WHY: After a session with errors, we want to systematically analyze what went wrong,
|
|
13
|
+
categorize the issues, and take appropriate actions to prevent similar issues in
|
|
14
|
+
future sessions.
|
|
15
|
+
|
|
16
|
+
DESIGN DECISION: Leverages existing FailureTracker for error collection, adds
|
|
17
|
+
categorization by source (script/skill/agent/user), and provides action-specific
|
|
18
|
+
handling based on category.
|
|
19
|
+
|
|
20
|
+
Integration points:
|
|
21
|
+
- FailureTracker: Source of error data from session
|
|
22
|
+
- DiagnosticRunner: Validation of fixes
|
|
23
|
+
- Git cache: Agent improvement PR creation
|
|
24
|
+
- SessionManager: Session identification and context
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
import re
|
|
28
|
+
from dataclasses import dataclass, field
|
|
29
|
+
from datetime import datetime, timezone
|
|
30
|
+
from enum import Enum
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
from typing import Dict, List, Optional
|
|
33
|
+
|
|
34
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
35
|
+
from claude_mpm.services.memory.failure_tracker import FailureEvent, get_failure_tracker
|
|
36
|
+
|
|
37
|
+
logger = get_logger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ErrorCategory(Enum):
|
|
41
|
+
"""Categories for error source classification."""
|
|
42
|
+
|
|
43
|
+
SCRIPT = "script" # Framework scripts (.py files in scripts/)
|
|
44
|
+
SKILL = "skill" # Skill files (.md in skills/)
|
|
45
|
+
AGENT = "agent" # Agent instruction files (.md in agents/)
|
|
46
|
+
USER_CODE = "user_code" # User's project code
|
|
47
|
+
UNKNOWN = "unknown" # Unable to categorize
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class ActionType(Enum):
|
|
51
|
+
"""Types of improvement actions."""
|
|
52
|
+
|
|
53
|
+
AUTO_FIX = "auto_fix" # Automatically fix and test
|
|
54
|
+
UPDATE_FILE = "update_file" # Update configuration/instruction file
|
|
55
|
+
CREATE_PR = "create_pr" # Create PR for agent improvements
|
|
56
|
+
SUGGEST = "suggest" # Provide suggestion only
|
|
57
|
+
NONE = "none" # No action available
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass
|
|
61
|
+
class ErrorAnalysis:
|
|
62
|
+
"""Analysis result for a single error.
|
|
63
|
+
|
|
64
|
+
Attributes:
|
|
65
|
+
failure_event: The original failure event
|
|
66
|
+
category: Error category (script/skill/agent/user)
|
|
67
|
+
root_cause: Identified root cause description
|
|
68
|
+
affected_file: File path if determinable
|
|
69
|
+
action_type: Recommended action type
|
|
70
|
+
fix_suggestion: Specific fix recommendation
|
|
71
|
+
priority: Priority level (critical/high/medium/low)
|
|
72
|
+
auto_fixable: Whether this can be automatically fixed
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
failure_event: FailureEvent
|
|
76
|
+
category: ErrorCategory
|
|
77
|
+
root_cause: str
|
|
78
|
+
affected_file: Optional[Path] = None
|
|
79
|
+
action_type: ActionType = ActionType.NONE
|
|
80
|
+
fix_suggestion: str = ""
|
|
81
|
+
priority: str = "medium"
|
|
82
|
+
auto_fixable: bool = False
|
|
83
|
+
metadata: Dict[str, str] = field(default_factory=dict)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@dataclass
|
|
87
|
+
class ImprovementAction:
|
|
88
|
+
"""Represents an action to take based on error analysis.
|
|
89
|
+
|
|
90
|
+
Attributes:
|
|
91
|
+
action_type: Type of action (auto_fix/update_file/create_pr/suggest)
|
|
92
|
+
error_analysis: The error analysis this addresses
|
|
93
|
+
description: Human-readable description
|
|
94
|
+
commands: Shell commands to execute (for auto_fix)
|
|
95
|
+
file_changes: Proposed file modifications
|
|
96
|
+
pr_branch: Branch name for PR (if create_pr)
|
|
97
|
+
pr_title: PR title (if create_pr)
|
|
98
|
+
pr_body: PR description (if create_pr)
|
|
99
|
+
status: Action status (pending/completed/failed)
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
action_type: ActionType
|
|
103
|
+
error_analysis: ErrorAnalysis
|
|
104
|
+
description: str
|
|
105
|
+
commands: List[str] = field(default_factory=list)
|
|
106
|
+
file_changes: Dict[str, str] = field(default_factory=dict)
|
|
107
|
+
pr_branch: Optional[str] = None
|
|
108
|
+
pr_title: Optional[str] = None
|
|
109
|
+
pr_body: Optional[str] = None
|
|
110
|
+
status: str = "pending"
|
|
111
|
+
error_message: Optional[str] = None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@dataclass
|
|
115
|
+
class PostmortemReport:
|
|
116
|
+
"""Complete postmortem analysis report.
|
|
117
|
+
|
|
118
|
+
Attributes:
|
|
119
|
+
session_id: Session identifier
|
|
120
|
+
start_time: Session start time
|
|
121
|
+
duration_seconds: Session duration
|
|
122
|
+
total_errors: Total error count
|
|
123
|
+
analyses: List of error analyses
|
|
124
|
+
actions: List of improvement actions
|
|
125
|
+
stats: Summary statistics
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
session_id: str
|
|
129
|
+
start_time: datetime
|
|
130
|
+
duration_seconds: float
|
|
131
|
+
total_errors: int
|
|
132
|
+
analyses: List[ErrorAnalysis] = field(default_factory=list)
|
|
133
|
+
actions: List[ImprovementAction] = field(default_factory=list)
|
|
134
|
+
stats: Dict[str, int] = field(default_factory=dict)
|
|
135
|
+
|
|
136
|
+
def get_actions_by_type(self, action_type: ActionType) -> List[ImprovementAction]:
|
|
137
|
+
"""Get all actions of a specific type.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
action_type: Action type to filter by
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
List of matching actions
|
|
144
|
+
"""
|
|
145
|
+
return [a for a in self.actions if a.action_type == action_type]
|
|
146
|
+
|
|
147
|
+
def get_analyses_by_category(self, category: ErrorCategory) -> List[ErrorAnalysis]:
|
|
148
|
+
"""Get all analyses for a specific category.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
category: Error category to filter by
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
List of matching analyses
|
|
155
|
+
"""
|
|
156
|
+
return [a for a in self.analyses if a.category == category]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class PostmortemService:
|
|
160
|
+
"""Service for analyzing session errors and generating improvement actions.
|
|
161
|
+
|
|
162
|
+
WHY: Provides structured analysis of session failures with categorization
|
|
163
|
+
and action recommendations based on error source and type.
|
|
164
|
+
|
|
165
|
+
DESIGN DECISION: Leverages existing FailureTracker for data, focuses on
|
|
166
|
+
categorization and actionable improvements rather than raw error collection.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
# File path patterns for categorization
|
|
170
|
+
SCRIPT_PATTERNS = [
|
|
171
|
+
r"scripts/",
|
|
172
|
+
r"claude_mpm/scripts/",
|
|
173
|
+
r"src/claude_mpm/scripts/",
|
|
174
|
+
]
|
|
175
|
+
|
|
176
|
+
SKILL_PATTERNS = [
|
|
177
|
+
r"\.claude/skills/",
|
|
178
|
+
r"skills/",
|
|
179
|
+
r"\.md$.*skill",
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
AGENT_PATTERNS = [
|
|
183
|
+
r"\.claude/agents/",
|
|
184
|
+
r"agents/",
|
|
185
|
+
r"\.md$.*agent",
|
|
186
|
+
]
|
|
187
|
+
|
|
188
|
+
def __init__(self):
|
|
189
|
+
"""Initialize the postmortem service."""
|
|
190
|
+
self.tracker = get_failure_tracker()
|
|
191
|
+
self.logger = logger
|
|
192
|
+
|
|
193
|
+
def analyze_session(self, session_id: Optional[str] = None) -> PostmortemReport:
|
|
194
|
+
"""Analyze errors from current or specified session.
|
|
195
|
+
|
|
196
|
+
WHY: Main entry point for postmortem analysis. Collects failures from
|
|
197
|
+
the tracker, categorizes them, and generates improvement actions.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
session_id: Optional session ID (uses tracker's session if None)
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Complete postmortem report with analyses and actions
|
|
204
|
+
"""
|
|
205
|
+
# Get session info
|
|
206
|
+
from claude_mpm.services.session_manager import get_session_manager
|
|
207
|
+
|
|
208
|
+
session_mgr = get_session_manager()
|
|
209
|
+
session_id = session_id or session_mgr.get_session_id()
|
|
210
|
+
start_time = session_mgr._session_start_time
|
|
211
|
+
duration = (datetime.now(timezone.utc) - start_time).total_seconds()
|
|
212
|
+
|
|
213
|
+
# Get all failures (both fixed and unfixed)
|
|
214
|
+
failures = self.tracker.failures
|
|
215
|
+
|
|
216
|
+
# Analyze each failure
|
|
217
|
+
analyses = []
|
|
218
|
+
for failure in failures:
|
|
219
|
+
analysis = self._analyze_failure(failure)
|
|
220
|
+
analyses.append(analysis)
|
|
221
|
+
|
|
222
|
+
# Generate improvement actions
|
|
223
|
+
actions = self._generate_actions(analyses)
|
|
224
|
+
|
|
225
|
+
# Calculate statistics
|
|
226
|
+
stats = self._calculate_stats(analyses, actions)
|
|
227
|
+
|
|
228
|
+
# Create report
|
|
229
|
+
report = PostmortemReport(
|
|
230
|
+
session_id=session_id,
|
|
231
|
+
start_time=start_time,
|
|
232
|
+
duration_seconds=duration,
|
|
233
|
+
total_errors=len(failures),
|
|
234
|
+
analyses=analyses,
|
|
235
|
+
actions=actions,
|
|
236
|
+
stats=stats,
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
self.logger.info(
|
|
240
|
+
f"Postmortem analysis complete: {len(failures)} errors, "
|
|
241
|
+
f"{len(actions)} actions generated"
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
return report
|
|
245
|
+
|
|
246
|
+
def _analyze_failure(self, failure: FailureEvent) -> ErrorAnalysis:
|
|
247
|
+
"""Analyze a single failure event.
|
|
248
|
+
|
|
249
|
+
WHY: Determines error category, root cause, affected file, and
|
|
250
|
+
recommended action based on failure context and error patterns.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
failure: Failure event to analyze
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
ErrorAnalysis with categorization and recommendations
|
|
257
|
+
"""
|
|
258
|
+
# Extract file path if available
|
|
259
|
+
affected_file = self._extract_file_path(failure)
|
|
260
|
+
|
|
261
|
+
# Categorize error source
|
|
262
|
+
category = self._categorize_error(failure, affected_file)
|
|
263
|
+
|
|
264
|
+
# Determine root cause
|
|
265
|
+
root_cause = self._determine_root_cause(failure)
|
|
266
|
+
|
|
267
|
+
# Determine action type based on category
|
|
268
|
+
action_type = self._determine_action_type(category, failure)
|
|
269
|
+
|
|
270
|
+
# Generate fix suggestion
|
|
271
|
+
fix_suggestion = self._generate_fix_suggestion(failure, category)
|
|
272
|
+
|
|
273
|
+
# Determine priority
|
|
274
|
+
priority = self._calculate_priority(failure)
|
|
275
|
+
|
|
276
|
+
# Check if auto-fixable
|
|
277
|
+
auto_fixable = self._is_auto_fixable(failure, category)
|
|
278
|
+
|
|
279
|
+
return ErrorAnalysis(
|
|
280
|
+
failure_event=failure,
|
|
281
|
+
category=category,
|
|
282
|
+
root_cause=root_cause,
|
|
283
|
+
affected_file=affected_file,
|
|
284
|
+
action_type=action_type,
|
|
285
|
+
fix_suggestion=fix_suggestion,
|
|
286
|
+
priority=priority,
|
|
287
|
+
auto_fixable=auto_fixable,
|
|
288
|
+
metadata={
|
|
289
|
+
"error_type": failure.context.get("error_type", "unknown"),
|
|
290
|
+
"task_type": failure.task_type,
|
|
291
|
+
"tool": failure.tool_name,
|
|
292
|
+
},
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
def _extract_file_path(self, failure: FailureEvent) -> Optional[Path]:
|
|
296
|
+
"""Extract file path from failure context or error message.
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
failure: Failure event
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
Path object if file found, None otherwise
|
|
303
|
+
"""
|
|
304
|
+
# Check context first
|
|
305
|
+
if "file" in failure.context:
|
|
306
|
+
return Path(failure.context["file"])
|
|
307
|
+
|
|
308
|
+
# Try to extract from error message
|
|
309
|
+
# Pattern: "File \"path/to/file.py\", line X"
|
|
310
|
+
file_pattern = r'File "([^"]+)"'
|
|
311
|
+
match = re.search(file_pattern, failure.error_message)
|
|
312
|
+
if match:
|
|
313
|
+
return Path(match.group(1))
|
|
314
|
+
|
|
315
|
+
# Pattern: path/to/file.py:line:col
|
|
316
|
+
path_pattern = r"([/\w\-_.]+\.(?:py|md|js|ts|json|yaml)):(\d+)"
|
|
317
|
+
match = re.search(path_pattern, failure.error_message)
|
|
318
|
+
if match:
|
|
319
|
+
return Path(match.group(1))
|
|
320
|
+
|
|
321
|
+
return None
|
|
322
|
+
|
|
323
|
+
def _categorize_error(
|
|
324
|
+
self, failure: FailureEvent, file_path: Optional[Path]
|
|
325
|
+
) -> ErrorCategory:
|
|
326
|
+
"""Categorize error by source (script/skill/agent/user).
|
|
327
|
+
|
|
328
|
+
Args:
|
|
329
|
+
failure: Failure event
|
|
330
|
+
file_path: Extracted file path
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
ErrorCategory enum value
|
|
334
|
+
"""
|
|
335
|
+
if not file_path:
|
|
336
|
+
# Try to infer from context
|
|
337
|
+
if "agent_type" in failure.context:
|
|
338
|
+
return ErrorCategory.AGENT
|
|
339
|
+
return ErrorCategory.UNKNOWN
|
|
340
|
+
|
|
341
|
+
file_str = str(file_path)
|
|
342
|
+
|
|
343
|
+
# Check script patterns
|
|
344
|
+
if any(re.search(pattern, file_str) for pattern in self.SCRIPT_PATTERNS):
|
|
345
|
+
return ErrorCategory.SCRIPT
|
|
346
|
+
|
|
347
|
+
# Check skill patterns
|
|
348
|
+
if any(re.search(pattern, file_str) for pattern in self.SKILL_PATTERNS):
|
|
349
|
+
return ErrorCategory.SKILL
|
|
350
|
+
|
|
351
|
+
# Check agent patterns
|
|
352
|
+
if any(re.search(pattern, file_str) for pattern in self.AGENT_PATTERNS):
|
|
353
|
+
return ErrorCategory.AGENT
|
|
354
|
+
|
|
355
|
+
# Check if in framework source (claude_mpm)
|
|
356
|
+
if "claude_mpm" in file_str and "scripts" not in file_str:
|
|
357
|
+
return ErrorCategory.SCRIPT
|
|
358
|
+
|
|
359
|
+
# Default to user code
|
|
360
|
+
return ErrorCategory.USER_CODE
|
|
361
|
+
|
|
362
|
+
def _determine_root_cause(self, failure: FailureEvent) -> str:
|
|
363
|
+
"""Determine root cause from failure event.
|
|
364
|
+
|
|
365
|
+
Args:
|
|
366
|
+
failure: Failure event
|
|
367
|
+
|
|
368
|
+
Returns:
|
|
369
|
+
Root cause description
|
|
370
|
+
"""
|
|
371
|
+
error_type = failure.context.get("error_type", "unknown")
|
|
372
|
+
error_msg = failure.error_message
|
|
373
|
+
|
|
374
|
+
# Map error types to root causes
|
|
375
|
+
cause_map = {
|
|
376
|
+
"syntax-error": "Syntax error in code",
|
|
377
|
+
"type-error": "Type mismatch or invalid operation",
|
|
378
|
+
"import-error": "Missing or incorrect import",
|
|
379
|
+
"module-not-found": "Missing dependency or module",
|
|
380
|
+
"file-not-found": "File path incorrect or file missing",
|
|
381
|
+
"test-failure": "Test assertion failed",
|
|
382
|
+
"command-error": "Command execution failed",
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
base_cause = cause_map.get(error_type, "Execution failure")
|
|
386
|
+
|
|
387
|
+
# Add specific error message snippet
|
|
388
|
+
error_snippet = error_msg[:80] + "..." if len(error_msg) > 80 else error_msg
|
|
389
|
+
return f"{base_cause}: {error_snippet}"
|
|
390
|
+
|
|
391
|
+
def _determine_action_type(
|
|
392
|
+
self, category: ErrorCategory, failure: FailureEvent
|
|
393
|
+
) -> ActionType:
|
|
394
|
+
"""Determine recommended action type based on category.
|
|
395
|
+
|
|
396
|
+
Args:
|
|
397
|
+
category: Error category
|
|
398
|
+
failure: Failure event
|
|
399
|
+
|
|
400
|
+
Returns:
|
|
401
|
+
ActionType enum value
|
|
402
|
+
"""
|
|
403
|
+
if category == ErrorCategory.SCRIPT:
|
|
404
|
+
# Scripts can be auto-fixed and tested
|
|
405
|
+
return ActionType.AUTO_FIX
|
|
406
|
+
|
|
407
|
+
if category == ErrorCategory.SKILL:
|
|
408
|
+
# Skills should be updated in place
|
|
409
|
+
return ActionType.UPDATE_FILE
|
|
410
|
+
|
|
411
|
+
if category == ErrorCategory.AGENT:
|
|
412
|
+
# Agents should trigger PR to remote repo
|
|
413
|
+
return ActionType.CREATE_PR
|
|
414
|
+
|
|
415
|
+
if category == ErrorCategory.USER_CODE:
|
|
416
|
+
# User code: suggest only, don't modify
|
|
417
|
+
return ActionType.SUGGEST
|
|
418
|
+
|
|
419
|
+
return ActionType.NONE
|
|
420
|
+
|
|
421
|
+
def _generate_fix_suggestion(
|
|
422
|
+
self, failure: FailureEvent, category: ErrorCategory
|
|
423
|
+
) -> str:
|
|
424
|
+
"""Generate specific fix suggestion based on error type.
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
failure: Failure event
|
|
428
|
+
category: Error category
|
|
429
|
+
|
|
430
|
+
Returns:
|
|
431
|
+
Fix suggestion string
|
|
432
|
+
"""
|
|
433
|
+
error_type = failure.context.get("error_type", "unknown")
|
|
434
|
+
|
|
435
|
+
# Category-specific suggestion templates
|
|
436
|
+
if category == ErrorCategory.SCRIPT:
|
|
437
|
+
return self._generate_script_fix_suggestion(failure, error_type)
|
|
438
|
+
|
|
439
|
+
if category == ErrorCategory.SKILL:
|
|
440
|
+
return self._generate_skill_fix_suggestion(failure, error_type)
|
|
441
|
+
|
|
442
|
+
if category == ErrorCategory.AGENT:
|
|
443
|
+
return self._generate_agent_fix_suggestion(failure, error_type)
|
|
444
|
+
|
|
445
|
+
if category == ErrorCategory.USER_CODE:
|
|
446
|
+
return self._generate_user_code_suggestion(failure, error_type)
|
|
447
|
+
|
|
448
|
+
return "Review error log and apply appropriate fix"
|
|
449
|
+
|
|
450
|
+
def _generate_script_fix_suggestion(
|
|
451
|
+
self, failure: FailureEvent, error_type: str
|
|
452
|
+
) -> str:
|
|
453
|
+
"""Generate fix suggestion for script errors."""
|
|
454
|
+
suggestions = {
|
|
455
|
+
"import-error": "Add missing import or verify module is installed",
|
|
456
|
+
"type-error": "Fix type validation or add proper type checking",
|
|
457
|
+
"syntax-error": "Correct syntax error in Python code",
|
|
458
|
+
"file-not-found": "Verify file paths and add existence checks",
|
|
459
|
+
}
|
|
460
|
+
return suggestions.get(error_type, "Test script in isolation and apply fix")
|
|
461
|
+
|
|
462
|
+
def _generate_skill_fix_suggestion(
|
|
463
|
+
self, failure: FailureEvent, error_type: str
|
|
464
|
+
) -> str:
|
|
465
|
+
"""Generate fix suggestion for skill errors."""
|
|
466
|
+
return (
|
|
467
|
+
"Update skill instructions to clarify error-prone section or "
|
|
468
|
+
"add validation step to prevent similar failures"
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
def _generate_agent_fix_suggestion(
|
|
472
|
+
self, failure: FailureEvent, error_type: str
|
|
473
|
+
) -> str:
|
|
474
|
+
"""Generate fix suggestion for agent errors."""
|
|
475
|
+
return (
|
|
476
|
+
"Improve agent instructions to handle this case correctly. "
|
|
477
|
+
"Consider adding examples or explicit error handling guidance"
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
def _generate_user_code_suggestion(
|
|
481
|
+
self, failure: FailureEvent, error_type: str
|
|
482
|
+
) -> str:
|
|
483
|
+
"""Generate suggestion for user code errors."""
|
|
484
|
+
suggestions = {
|
|
485
|
+
"syntax-error": "Fix syntax error in your code",
|
|
486
|
+
"type-error": "Check types and ensure valid operations",
|
|
487
|
+
"import-error": "Verify import paths and installed packages",
|
|
488
|
+
"test-failure": "Review test assertions and fix failing test",
|
|
489
|
+
}
|
|
490
|
+
return suggestions.get(
|
|
491
|
+
error_type, "Review error and apply appropriate fix to your code"
|
|
492
|
+
)
|
|
493
|
+
|
|
494
|
+
def _calculate_priority(self, failure: FailureEvent) -> str:
|
|
495
|
+
"""Calculate priority level for error.
|
|
496
|
+
|
|
497
|
+
Args:
|
|
498
|
+
failure: Failure event
|
|
499
|
+
|
|
500
|
+
Returns:
|
|
501
|
+
Priority string (critical/high/medium/low)
|
|
502
|
+
"""
|
|
503
|
+
error_type = failure.context.get("error_type", "unknown")
|
|
504
|
+
|
|
505
|
+
# Critical errors
|
|
506
|
+
if error_type in ("syntax-error", "import-error", "module-not-found"):
|
|
507
|
+
return "critical"
|
|
508
|
+
|
|
509
|
+
# High priority errors
|
|
510
|
+
if error_type in ("type-error", "test-failure"):
|
|
511
|
+
return "high"
|
|
512
|
+
|
|
513
|
+
# Medium priority (default)
|
|
514
|
+
return "medium"
|
|
515
|
+
|
|
516
|
+
def _is_auto_fixable(self, failure: FailureEvent, category: ErrorCategory) -> bool:
|
|
517
|
+
"""Determine if error can be automatically fixed.
|
|
518
|
+
|
|
519
|
+
Args:
|
|
520
|
+
failure: Failure event
|
|
521
|
+
category: Error category
|
|
522
|
+
|
|
523
|
+
Returns:
|
|
524
|
+
True if auto-fixable
|
|
525
|
+
"""
|
|
526
|
+
# Only scripts are auto-fixable in MVP
|
|
527
|
+
if category != ErrorCategory.SCRIPT:
|
|
528
|
+
return False
|
|
529
|
+
|
|
530
|
+
error_type = failure.context.get("error_type", "unknown")
|
|
531
|
+
|
|
532
|
+
# Simple error types that can be fixed
|
|
533
|
+
auto_fixable_types = [
|
|
534
|
+
"import-error", # Add missing import
|
|
535
|
+
"file-not-found", # Fix path or add check
|
|
536
|
+
]
|
|
537
|
+
|
|
538
|
+
return error_type in auto_fixable_types
|
|
539
|
+
|
|
540
|
+
def _generate_actions(
|
|
541
|
+
self, analyses: List[ErrorAnalysis]
|
|
542
|
+
) -> List[ImprovementAction]:
|
|
543
|
+
"""Generate improvement actions from error analyses.
|
|
544
|
+
|
|
545
|
+
Args:
|
|
546
|
+
analyses: List of error analyses
|
|
547
|
+
|
|
548
|
+
Returns:
|
|
549
|
+
List of improvement actions
|
|
550
|
+
"""
|
|
551
|
+
actions = []
|
|
552
|
+
|
|
553
|
+
for analysis in analyses:
|
|
554
|
+
if analysis.action_type == ActionType.NONE:
|
|
555
|
+
continue
|
|
556
|
+
|
|
557
|
+
action = self._create_action(analysis)
|
|
558
|
+
if action:
|
|
559
|
+
actions.append(action)
|
|
560
|
+
|
|
561
|
+
return actions
|
|
562
|
+
|
|
563
|
+
def _create_action(self, analysis: ErrorAnalysis) -> Optional[ImprovementAction]:
|
|
564
|
+
"""Create specific action based on analysis.
|
|
565
|
+
|
|
566
|
+
Args:
|
|
567
|
+
analysis: Error analysis
|
|
568
|
+
|
|
569
|
+
Returns:
|
|
570
|
+
ImprovementAction or None
|
|
571
|
+
"""
|
|
572
|
+
if analysis.action_type == ActionType.AUTO_FIX:
|
|
573
|
+
return self._create_auto_fix_action(analysis)
|
|
574
|
+
|
|
575
|
+
if analysis.action_type == ActionType.UPDATE_FILE:
|
|
576
|
+
return self._create_update_file_action(analysis)
|
|
577
|
+
|
|
578
|
+
if analysis.action_type == ActionType.CREATE_PR:
|
|
579
|
+
return self._create_pr_action(analysis)
|
|
580
|
+
|
|
581
|
+
if analysis.action_type == ActionType.SUGGEST:
|
|
582
|
+
return self._create_suggestion_action(analysis)
|
|
583
|
+
|
|
584
|
+
return None
|
|
585
|
+
|
|
586
|
+
def _create_auto_fix_action(self, analysis: ErrorAnalysis) -> ImprovementAction:
|
|
587
|
+
"""Create auto-fix action for script errors.
|
|
588
|
+
|
|
589
|
+
Args:
|
|
590
|
+
analysis: Error analysis
|
|
591
|
+
|
|
592
|
+
Returns:
|
|
593
|
+
ImprovementAction for auto-fixing
|
|
594
|
+
"""
|
|
595
|
+
description = f"Auto-fix {analysis.affected_file}: {analysis.fix_suggestion}"
|
|
596
|
+
|
|
597
|
+
# Generate test commands
|
|
598
|
+
commands = []
|
|
599
|
+
if analysis.affected_file:
|
|
600
|
+
# Add syntax check
|
|
601
|
+
commands.append(f"python -m py_compile {analysis.affected_file}")
|
|
602
|
+
|
|
603
|
+
# Add basic import test
|
|
604
|
+
commands.append(f"python -c 'import {analysis.affected_file.stem}'")
|
|
605
|
+
|
|
606
|
+
return ImprovementAction(
|
|
607
|
+
action_type=ActionType.AUTO_FIX,
|
|
608
|
+
error_analysis=analysis,
|
|
609
|
+
description=description,
|
|
610
|
+
commands=commands,
|
|
611
|
+
)
|
|
612
|
+
|
|
613
|
+
def _create_update_file_action(self, analysis: ErrorAnalysis) -> ImprovementAction:
|
|
614
|
+
"""Create update file action for skills.
|
|
615
|
+
|
|
616
|
+
Args:
|
|
617
|
+
analysis: Error analysis
|
|
618
|
+
|
|
619
|
+
Returns:
|
|
620
|
+
ImprovementAction for file update
|
|
621
|
+
"""
|
|
622
|
+
description = f"Update {analysis.affected_file}: {analysis.fix_suggestion}"
|
|
623
|
+
|
|
624
|
+
return ImprovementAction(
|
|
625
|
+
action_type=ActionType.UPDATE_FILE,
|
|
626
|
+
error_analysis=analysis,
|
|
627
|
+
description=description,
|
|
628
|
+
)
|
|
629
|
+
|
|
630
|
+
def _create_pr_action(self, analysis: ErrorAnalysis) -> ImprovementAction:
|
|
631
|
+
"""Create PR action for agent improvements.
|
|
632
|
+
|
|
633
|
+
Args:
|
|
634
|
+
analysis: Error analysis
|
|
635
|
+
|
|
636
|
+
Returns:
|
|
637
|
+
ImprovementAction for PR creation
|
|
638
|
+
"""
|
|
639
|
+
# Generate PR details
|
|
640
|
+
agent_name = (
|
|
641
|
+
analysis.affected_file.stem if analysis.affected_file else "unknown"
|
|
642
|
+
)
|
|
643
|
+
branch_name = f"fix/{agent_name}-{datetime.now(timezone.utc):%Y%m%d}"
|
|
644
|
+
|
|
645
|
+
pr_title = f"Fix: {agent_name} - {analysis.failure_event.task_type} error"
|
|
646
|
+
|
|
647
|
+
pr_body = f"""## Problem
|
|
648
|
+
|
|
649
|
+
{analysis.root_cause}
|
|
650
|
+
|
|
651
|
+
## Error Log
|
|
652
|
+
|
|
653
|
+
```
|
|
654
|
+
{analysis.failure_event.error_message}
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
## Proposed Improvement
|
|
658
|
+
|
|
659
|
+
{analysis.fix_suggestion}
|
|
660
|
+
|
|
661
|
+
## Context
|
|
662
|
+
|
|
663
|
+
- Task Type: {analysis.failure_event.task_type}
|
|
664
|
+
- Tool: {analysis.failure_event.tool_name}
|
|
665
|
+
- Error Type: {analysis.metadata.get("error_type", "unknown")}
|
|
666
|
+
|
|
667
|
+
## Testing
|
|
668
|
+
|
|
669
|
+
- [ ] Test agent with similar input
|
|
670
|
+
- [ ] Verify improvement addresses root cause
|
|
671
|
+
- [ ] Check for regression in existing functionality
|
|
672
|
+
"""
|
|
673
|
+
|
|
674
|
+
description = f"Create PR for {agent_name} improvement"
|
|
675
|
+
|
|
676
|
+
return ImprovementAction(
|
|
677
|
+
action_type=ActionType.CREATE_PR,
|
|
678
|
+
error_analysis=analysis,
|
|
679
|
+
description=description,
|
|
680
|
+
pr_branch=branch_name,
|
|
681
|
+
pr_title=pr_title,
|
|
682
|
+
pr_body=pr_body,
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
def _create_suggestion_action(self, analysis: ErrorAnalysis) -> ImprovementAction:
|
|
686
|
+
"""Create suggestion action for user code.
|
|
687
|
+
|
|
688
|
+
Args:
|
|
689
|
+
analysis: Error analysis
|
|
690
|
+
|
|
691
|
+
Returns:
|
|
692
|
+
ImprovementAction with suggestion
|
|
693
|
+
"""
|
|
694
|
+
description = (
|
|
695
|
+
f"Suggestion for {analysis.affected_file}: {analysis.fix_suggestion}"
|
|
696
|
+
)
|
|
697
|
+
|
|
698
|
+
return ImprovementAction(
|
|
699
|
+
action_type=ActionType.SUGGEST,
|
|
700
|
+
error_analysis=analysis,
|
|
701
|
+
description=description,
|
|
702
|
+
)
|
|
703
|
+
|
|
704
|
+
def _calculate_stats(
|
|
705
|
+
self, analyses: List[ErrorAnalysis], actions: List[ImprovementAction]
|
|
706
|
+
) -> Dict[str, int]:
|
|
707
|
+
"""Calculate summary statistics.
|
|
708
|
+
|
|
709
|
+
Args:
|
|
710
|
+
analyses: List of error analyses
|
|
711
|
+
actions: List of improvement actions
|
|
712
|
+
|
|
713
|
+
Returns:
|
|
714
|
+
Statistics dictionary
|
|
715
|
+
"""
|
|
716
|
+
stats = {
|
|
717
|
+
"total_errors": len(analyses),
|
|
718
|
+
"script_errors": len(
|
|
719
|
+
[a for a in analyses if a.category == ErrorCategory.SCRIPT]
|
|
720
|
+
),
|
|
721
|
+
"skill_errors": len(
|
|
722
|
+
[a for a in analyses if a.category == ErrorCategory.SKILL]
|
|
723
|
+
),
|
|
724
|
+
"agent_errors": len(
|
|
725
|
+
[a for a in analyses if a.category == ErrorCategory.AGENT]
|
|
726
|
+
),
|
|
727
|
+
"user_code_errors": len(
|
|
728
|
+
[a for a in analyses if a.category == ErrorCategory.USER_CODE]
|
|
729
|
+
),
|
|
730
|
+
"auto_fixable": len([a for a in analyses if a.auto_fixable]),
|
|
731
|
+
"critical_priority": len([a for a in analyses if a.priority == "critical"]),
|
|
732
|
+
"high_priority": len([a for a in analyses if a.priority == "high"]),
|
|
733
|
+
"total_actions": len(actions),
|
|
734
|
+
"auto_fix_actions": len(
|
|
735
|
+
[a for a in actions if a.action_type == ActionType.AUTO_FIX]
|
|
736
|
+
),
|
|
737
|
+
"pr_actions": len(
|
|
738
|
+
[a for a in actions if a.action_type == ActionType.CREATE_PR]
|
|
739
|
+
),
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
return {
|
|
743
|
+
"total_errors": stats["total_errors"],
|
|
744
|
+
"by_category": stats["by_category"],
|
|
745
|
+
"high_priority": stats["high_priority"],
|
|
746
|
+
"total_actions": stats["total_actions"],
|
|
747
|
+
"auto_fix_actions": stats["auto_fix_actions"],
|
|
748
|
+
"pr_actions": stats["pr_actions"],
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
|
|
752
|
+
# Singleton instance
|
|
753
|
+
_service_instance: Optional[PostmortemService] = None
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
def get_postmortem_service() -> PostmortemService:
|
|
757
|
+
"""Get or create singleton PostmortemService instance.
|
|
758
|
+
|
|
759
|
+
Returns:
|
|
760
|
+
PostmortemService instance
|
|
761
|
+
"""
|
|
762
|
+
global _service_instance
|
|
763
|
+
if _service_instance is None:
|
|
764
|
+
_service_instance = PostmortemService()
|
|
765
|
+
return _service_instance
|