claude-mpm 3.9.9__py3-none-any.whl → 4.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +155 -0
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +1 -1
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +90 -49
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +21 -18
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +143 -762
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +203 -81
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +305 -197
- claude_mpm/cli/parser.py +24 -1150
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +104 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +36 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +120 -54
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +571 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +40 -23
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +14 -21
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +97 -93
- claude_mpm/services/mcp_gateway/main.py +307 -127
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
- claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +110 -121
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +223 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +145 -65
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +170 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +20 -534
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +552 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/memory_guardian.py +0 -770
- claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.9.dist-info/RECORD +0 -293
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -8,20 +8,21 @@ Enforces template structure and provides section-specific update methods. | |
| 8 8 | 
             
            """
         | 
| 9 9 |  | 
| 10 10 | 
             
            import logging
         | 
| 11 | 
            -
            from pathlib import Path
         | 
| 12 | 
            -
            from typing import Dict, List, Optional, Any
         | 
| 13 | 
            -
            from datetime import datetime
         | 
| 14 11 | 
             
            from dataclasses import dataclass, field
         | 
| 12 | 
            +
            from datetime import datetime
         | 
| 15 13 | 
             
            from enum import Enum
         | 
| 14 | 
            +
            from pathlib import Path
         | 
| 15 | 
            +
            from typing import Any, Dict, List, Optional
         | 
| 16 16 |  | 
| 17 | 
            -
            from claude_mpm.services.memory.cache.shared_prompt_cache import SharedPromptCache
         | 
| 18 17 | 
             
            from claude_mpm.agents.base_agent_loader import clear_base_agent_cache
         | 
| 18 | 
            +
            from claude_mpm.services.memory.cache.shared_prompt_cache import SharedPromptCache
         | 
| 19 19 |  | 
| 20 20 | 
             
            logger = logging.getLogger(__name__)
         | 
| 21 21 |  | 
| 22 22 |  | 
| 23 23 | 
             
            class BaseAgentSection(str, Enum):
         | 
| 24 24 | 
             
                """Base agent markdown sections."""
         | 
| 25 | 
            +
             | 
| 25 26 | 
             
                FRAMEWORK_CONTEXT = "Agent Framework Context"
         | 
| 26 27 | 
             
                BEHAVIORAL_RULES = "Common Behavioral Rules"
         | 
| 27 28 | 
             
                TEMPORAL_CONTEXT = "Temporal Context Integration"
         | 
| @@ -39,10 +40,11 @@ class BaseAgentSection(str, Enum): | |
| 39 40 | 
             
            @dataclass
         | 
| 40 41 | 
             
            class BaseAgentStructure:
         | 
| 41 42 | 
             
                """Structured representation of base_agent.md content."""
         | 
| 43 | 
            +
             | 
| 42 44 | 
             
                # Header
         | 
| 43 45 | 
             
                title: str = "Base Agent Instructions"
         | 
| 44 46 | 
             
                description: str = "These instructions are prepended to EVERY agent prompt."
         | 
| 45 | 
            -
             | 
| 47 | 
            +
             | 
| 46 48 | 
             
                # Main sections
         | 
| 47 49 | 
             
                framework_context: Dict[str, Any] = field(default_factory=dict)
         | 
| 48 50 | 
             
                behavioral_rules: Dict[str, List[str]] = field(default_factory=dict)
         | 
| @@ -56,47 +58,48 @@ class BaseAgentStructure: | |
| 56 58 | 
             
                framework_integration: Dict[str, List[str]] = field(default_factory=dict)
         | 
| 57 59 | 
             
                universal_constraints: List[str] = field(default_factory=list)
         | 
| 58 60 | 
             
                success_criteria: List[str] = field(default_factory=list)
         | 
| 59 | 
            -
             | 
| 61 | 
            +
             | 
| 60 62 | 
             
                # Raw sections for preservation
         | 
| 61 63 | 
             
                raw_sections: Dict[str, str] = field(default_factory=dict)
         | 
| 62 64 |  | 
| 63 65 |  | 
| 64 66 | 
             
            class BaseAgentManager:
         | 
| 65 67 | 
             
                """Manages base_agent.md with structured updates and validation."""
         | 
| 66 | 
            -
             | 
| 68 | 
            +
             | 
| 67 69 | 
             
                def __init__(self, agents_dir: Optional[Path] = None):
         | 
| 68 70 | 
             
                    """Initialize BaseAgentManager."""
         | 
| 69 71 | 
             
                    self.agents_dir = agents_dir or Path(__file__).parent.parent / "agents"
         | 
| 70 72 | 
             
                    self.base_agent_path = self.agents_dir / "BASE_AGENT_TEMPLATE.md"
         | 
| 71 73 | 
             
                    self.cache = SharedPromptCache.get_instance()
         | 
| 72 | 
            -
             | 
| 74 | 
            +
             | 
| 73 75 | 
             
                def read_base_agent(self) -> Optional[BaseAgentStructure]:
         | 
| 74 76 | 
             
                    """
         | 
| 75 77 | 
             
                    Read and parse base_agent.md into structured format.
         | 
| 76 | 
            -
             | 
| 78 | 
            +
             | 
| 77 79 | 
             
                    Returns:
         | 
| 78 80 | 
             
                        BaseAgentStructure or None if file doesn't exist
         | 
| 79 81 | 
             
                    """
         | 
| 80 82 | 
             
                    if not self.base_agent_path.exists():
         | 
| 81 83 | 
             
                        logger.error(f"base_agent.md not found at {self.base_agent_path}")
         | 
| 82 84 | 
             
                        return None
         | 
| 83 | 
            -
             | 
| 85 | 
            +
             | 
| 84 86 | 
             
                    try:
         | 
| 85 | 
            -
                        content = self.base_agent_path.read_text(encoding= | 
| 87 | 
            +
                        content = self.base_agent_path.read_text(encoding="utf-8")
         | 
| 86 88 | 
             
                        return self._parse_base_agent(content)
         | 
| 87 89 | 
             
                    except Exception as e:
         | 
| 88 90 | 
             
                        logger.error(f"Error reading base_agent.md: {e}")
         | 
| 89 91 | 
             
                        return None
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                def update_base_agent( | 
| 92 | 
            -
             | 
| 92 | 
            +
             | 
| 93 | 
            +
                def update_base_agent(
         | 
| 94 | 
            +
                    self, updates: Dict[str, Any], backup: bool = True
         | 
| 95 | 
            +
                ) -> Optional[BaseAgentStructure]:
         | 
| 93 96 | 
             
                    """
         | 
| 94 97 | 
             
                    Update base_agent.md with structured updates.
         | 
| 95 | 
            -
             | 
| 98 | 
            +
             | 
| 96 99 | 
             
                    Args:
         | 
| 97 100 | 
             
                        updates: Dictionary of updates to apply
         | 
| 98 101 | 
             
                        backup: Whether to create backup before updating
         | 
| 99 | 
            -
             | 
| 102 | 
            +
             | 
| 100 103 | 
             
                    Returns:
         | 
| 101 104 | 
             
                        Updated BaseAgentStructure or None if failed
         | 
| 102 105 | 
             
                    """
         | 
| @@ -105,46 +108,47 @@ class BaseAgentManager: | |
| 105 108 | 
             
                    if not current:
         | 
| 106 109 | 
             
                        logger.error("Cannot update - base_agent.md not found")
         | 
| 107 110 | 
             
                        return None
         | 
| 108 | 
            -
             | 
| 111 | 
            +
             | 
| 109 112 | 
             
                    # Create backup if requested
         | 
| 110 113 | 
             
                    if backup:
         | 
| 111 114 | 
             
                        self._create_backup()
         | 
| 112 | 
            -
             | 
| 115 | 
            +
             | 
| 113 116 | 
             
                    # Apply updates
         | 
| 114 117 | 
             
                    for key, value in updates.items():
         | 
| 115 118 | 
             
                        if hasattr(current, key):
         | 
| 116 119 | 
             
                            setattr(current, key, value)
         | 
| 117 120 | 
             
                        else:
         | 
| 118 121 | 
             
                            logger.warning(f"Unknown base agent attribute: {key}")
         | 
| 119 | 
            -
             | 
| 122 | 
            +
             | 
| 120 123 | 
             
                    # Convert back to markdown and save
         | 
| 121 124 | 
             
                    content = self._structure_to_markdown(current)
         | 
| 122 | 
            -
                    self.base_agent_path.write_text(content, encoding= | 
| 123 | 
            -
             | 
| 125 | 
            +
                    self.base_agent_path.write_text(content, encoding="utf-8")
         | 
| 126 | 
            +
             | 
| 124 127 | 
             
                    # Clear caches
         | 
| 125 128 | 
             
                    clear_base_agent_cache()
         | 
| 126 129 | 
             
                    self.cache.invalidate("base_agent:instructions")
         | 
| 127 | 
            -
             | 
| 130 | 
            +
             | 
| 128 131 | 
             
                    logger.info("Base agent updated successfully")
         | 
| 129 132 | 
             
                    return current
         | 
| 130 | 
            -
             | 
| 131 | 
            -
                def update_section( | 
| 132 | 
            -
             | 
| 133 | 
            +
             | 
| 134 | 
            +
                def update_section(
         | 
| 135 | 
            +
                    self, section: BaseAgentSection, content: str, backup: bool = True
         | 
| 136 | 
            +
                ) -> Optional[BaseAgentStructure]:
         | 
| 133 137 | 
             
                    """
         | 
| 134 138 | 
             
                    Update a specific section of base_agent.md.
         | 
| 135 | 
            -
             | 
| 139 | 
            +
             | 
| 136 140 | 
             
                    Args:
         | 
| 137 141 | 
             
                        section: Section to update
         | 
| 138 142 | 
             
                        content: New section content
         | 
| 139 143 | 
             
                        backup: Whether to create backup
         | 
| 140 | 
            -
             | 
| 144 | 
            +
             | 
| 141 145 | 
             
                    Returns:
         | 
| 142 146 | 
             
                        Updated BaseAgentStructure or None
         | 
| 143 147 | 
             
                    """
         | 
| 144 148 | 
             
                    current = self.read_base_agent()
         | 
| 145 149 | 
             
                    if not current:
         | 
| 146 150 | 
             
                        return None
         | 
| 147 | 
            -
             | 
| 151 | 
            +
             | 
| 148 152 | 
             
                    # Map sections to structure attributes
         | 
| 149 153 | 
             
                    section_map = {
         | 
| 150 154 | 
             
                        BaseAgentSection.FRAMEWORK_CONTEXT: "framework_context",
         | 
| @@ -158,15 +162,18 @@ class BaseAgentManager: | |
| 158 162 | 
             
                        BaseAgentSection.OUTPUT_FORMATS: "output_formats",
         | 
| 159 163 | 
             
                        BaseAgentSection.FRAMEWORK_INTEGRATION: "framework_integration",
         | 
| 160 164 | 
             
                        BaseAgentSection.CONSTRAINTS: "universal_constraints",
         | 
| 161 | 
            -
                        BaseAgentSection.SUCCESS_CRITERIA: "success_criteria"
         | 
| 165 | 
            +
                        BaseAgentSection.SUCCESS_CRITERIA: "success_criteria",
         | 
| 162 166 | 
             
                    }
         | 
| 163 | 
            -
             | 
| 167 | 
            +
             | 
| 164 168 | 
             
                    if section in section_map:
         | 
| 165 169 | 
             
                        attr_name = section_map[section]
         | 
| 166 | 
            -
             | 
| 170 | 
            +
             | 
| 167 171 | 
             
                        # Parse content based on section type
         | 
| 168 | 
            -
                        if section in [ | 
| 169 | 
            -
             | 
| 172 | 
            +
                        if section in [
         | 
| 173 | 
            +
                            BaseAgentSection.ESCALATION,
         | 
| 174 | 
            +
                            BaseAgentSection.CONSTRAINTS,
         | 
| 175 | 
            +
                            BaseAgentSection.SUCCESS_CRITERIA,
         | 
| 176 | 
            +
                        ]:
         | 
| 170 177 | 
             
                            # List sections
         | 
| 171 178 | 
             
                            parsed_content = self._parse_list_content(content)
         | 
| 172 179 | 
             
                            setattr(current, attr_name, parsed_content)
         | 
| @@ -176,68 +183,68 @@ class BaseAgentManager: | |
| 176 183 | 
             
                        else:
         | 
| 177 184 | 
             
                            # Dictionary sections - preserve raw for now
         | 
| 178 185 | 
             
                            current.raw_sections[section.value] = content
         | 
| 179 | 
            -
             | 
| 186 | 
            +
             | 
| 180 187 | 
             
                    # Update and return
         | 
| 181 188 | 
             
                    return self.update_base_agent({}, backup=backup)
         | 
| 182 | 
            -
             | 
| 189 | 
            +
             | 
| 183 190 | 
             
                def add_behavioral_rule(self, category: str, rule: str) -> bool:
         | 
| 184 191 | 
             
                    """Add a new behavioral rule to a specific category."""
         | 
| 185 192 | 
             
                    current = self.read_base_agent()
         | 
| 186 193 | 
             
                    if not current:
         | 
| 187 194 | 
             
                        return False
         | 
| 188 | 
            -
             | 
| 195 | 
            +
             | 
| 189 196 | 
             
                    if category not in current.behavioral_rules:
         | 
| 190 197 | 
             
                        current.behavioral_rules[category] = []
         | 
| 191 | 
            -
             | 
| 198 | 
            +
             | 
| 192 199 | 
             
                    if rule not in current.behavioral_rules[category]:
         | 
| 193 200 | 
             
                        current.behavioral_rules[category].append(rule)
         | 
| 194 201 | 
             
                        self.update_base_agent({"behavioral_rules": current.behavioral_rules})
         | 
| 195 202 | 
             
                        return True
         | 
| 196 | 
            -
             | 
| 203 | 
            +
             | 
| 197 204 | 
             
                    return False
         | 
| 198 | 
            -
             | 
| 205 | 
            +
             | 
| 199 206 | 
             
                def add_quality_standard(self, category: str, standard: str) -> bool:
         | 
| 200 207 | 
             
                    """Add a new quality standard to a specific category."""
         | 
| 201 208 | 
             
                    current = self.read_base_agent()
         | 
| 202 209 | 
             
                    if not current:
         | 
| 203 210 | 
             
                        return False
         | 
| 204 | 
            -
             | 
| 211 | 
            +
             | 
| 205 212 | 
             
                    if category not in current.quality_standards:
         | 
| 206 213 | 
             
                        current.quality_standards[category] = []
         | 
| 207 | 
            -
             | 
| 214 | 
            +
             | 
| 208 215 | 
             
                    if standard not in current.quality_standards[category]:
         | 
| 209 216 | 
             
                        current.quality_standards[category].append(standard)
         | 
| 210 217 | 
             
                        self.update_base_agent({"quality_standards": current.quality_standards})
         | 
| 211 218 | 
             
                        return True
         | 
| 212 | 
            -
             | 
| 219 | 
            +
             | 
| 213 220 | 
             
                    return False
         | 
| 214 | 
            -
             | 
| 221 | 
            +
             | 
| 215 222 | 
             
                def add_escalation_trigger(self, trigger: str) -> bool:
         | 
| 216 223 | 
             
                    """Add a new escalation trigger."""
         | 
| 217 224 | 
             
                    current = self.read_base_agent()
         | 
| 218 225 | 
             
                    if not current:
         | 
| 219 226 | 
             
                        return False
         | 
| 220 | 
            -
             | 
| 227 | 
            +
             | 
| 221 228 | 
             
                    if trigger not in current.escalation_triggers:
         | 
| 222 229 | 
             
                        current.escalation_triggers.append(trigger)
         | 
| 223 230 | 
             
                        self.update_base_agent({"escalation_triggers": current.escalation_triggers})
         | 
| 224 231 | 
             
                        return True
         | 
| 225 | 
            -
             | 
| 232 | 
            +
             | 
| 226 233 | 
             
                    return False
         | 
| 227 | 
            -
             | 
| 234 | 
            +
             | 
| 228 235 | 
             
                def validate_structure(self) -> Dict[str, bool]:
         | 
| 229 236 | 
             
                    """
         | 
| 230 237 | 
             
                    Validate that base_agent.md has all required sections.
         | 
| 231 | 
            -
             | 
| 238 | 
            +
             | 
| 232 239 | 
             
                    Returns:
         | 
| 233 240 | 
             
                        Dictionary of section names to validation status
         | 
| 234 241 | 
             
                    """
         | 
| 235 242 | 
             
                    current = self.read_base_agent()
         | 
| 236 243 | 
             
                    if not current:
         | 
| 237 244 | 
             
                        return {section.value: False for section in BaseAgentSection}
         | 
| 238 | 
            -
             | 
| 245 | 
            +
             | 
| 239 246 | 
             
                    validation = {}
         | 
| 240 | 
            -
             | 
| 247 | 
            +
             | 
| 241 248 | 
             
                    # Check each section
         | 
| 242 249 | 
             
                    for section in BaseAgentSection:
         | 
| 243 250 | 
             
                        if section == BaseAgentSection.FRAMEWORK_CONTEXT:
         | 
| @@ -264,91 +271,93 @@ class BaseAgentManager: | |
| 264 271 | 
             
                            validation[section.value] = bool(current.universal_constraints)
         | 
| 265 272 | 
             
                        elif section == BaseAgentSection.SUCCESS_CRITERIA:
         | 
| 266 273 | 
             
                            validation[section.value] = bool(current.success_criteria)
         | 
| 267 | 
            -
             | 
| 274 | 
            +
             | 
| 268 275 | 
             
                    return validation
         | 
| 269 | 
            -
             | 
| 276 | 
            +
             | 
| 270 277 | 
             
                # Private helper methods
         | 
| 271 | 
            -
             | 
| 278 | 
            +
             | 
| 272 279 | 
             
                def _parse_base_agent(self, content: str) -> BaseAgentStructure:
         | 
| 273 280 | 
             
                    """Parse base_agent.md content into structured format."""
         | 
| 274 281 | 
             
                    structure = BaseAgentStructure()
         | 
| 275 | 
            -
             | 
| 282 | 
            +
             | 
| 276 283 | 
             
                    # For now, store raw content in sections
         | 
| 277 284 | 
             
                    # Full parsing implementation would extract structured data
         | 
| 278 | 
            -
                    lines = content.split( | 
| 285 | 
            +
                    lines = content.split("\n")
         | 
| 279 286 | 
             
                    current_section = None
         | 
| 280 287 | 
             
                    section_content = []
         | 
| 281 | 
            -
             | 
| 288 | 
            +
             | 
| 282 289 | 
             
                    for line in lines:
         | 
| 283 | 
            -
                        if line.startswith( | 
| 290 | 
            +
                        if line.startswith("## "):
         | 
| 284 291 | 
             
                            # Save previous section
         | 
| 285 292 | 
             
                            if current_section:
         | 
| 286 | 
            -
                                structure.raw_sections[current_section] =  | 
| 287 | 
            -
             | 
| 293 | 
            +
                                structure.raw_sections[current_section] = "\n".join(section_content)
         | 
| 294 | 
            +
             | 
| 288 295 | 
             
                            # Start new section
         | 
| 289 296 | 
             
                            current_section = line[3:].strip()
         | 
| 290 297 | 
             
                            section_content = []
         | 
| 291 298 | 
             
                        elif current_section:
         | 
| 292 299 | 
             
                            section_content.append(line)
         | 
| 293 | 
            -
             | 
| 300 | 
            +
             | 
| 294 301 | 
             
                    # Save last section
         | 
| 295 302 | 
             
                    if current_section:
         | 
| 296 | 
            -
                        structure.raw_sections[current_section] =  | 
| 297 | 
            -
             | 
| 303 | 
            +
                        structure.raw_sections[current_section] = "\n".join(section_content)
         | 
| 304 | 
            +
             | 
| 298 305 | 
             
                    # Parse specific sections
         | 
| 299 306 | 
             
                    if BaseAgentSection.ESCALATION.value in structure.raw_sections:
         | 
| 300 307 | 
             
                        structure.escalation_triggers = self._parse_list_content(
         | 
| 301 308 | 
             
                            structure.raw_sections[BaseAgentSection.ESCALATION.value]
         | 
| 302 309 | 
             
                        )
         | 
| 303 | 
            -
             | 
| 310 | 
            +
             | 
| 304 311 | 
             
                    return structure
         | 
| 305 | 
            -
             | 
| 312 | 
            +
             | 
| 306 313 | 
             
                def _structure_to_markdown(self, structure: BaseAgentStructure) -> str:
         | 
| 307 314 | 
             
                    """Convert BaseAgentStructure back to markdown format."""
         | 
| 308 315 | 
             
                    lines = []
         | 
| 309 | 
            -
             | 
| 316 | 
            +
             | 
| 310 317 | 
             
                    # Header
         | 
| 311 318 | 
             
                    lines.append(f"# {structure.title}")
         | 
| 312 319 | 
             
                    lines.append("")
         | 
| 313 320 | 
             
                    lines.append("<!-- ")
         | 
| 314 321 | 
             
                    lines.append(structure.description)
         | 
| 315 | 
            -
                    lines.append( | 
| 322 | 
            +
                    lines.append(
         | 
| 323 | 
            +
                        "They contain common rules, behaviors, and constraints that apply to ALL agents."
         | 
| 324 | 
            +
                    )
         | 
| 316 325 | 
             
                    lines.append("-->")
         | 
| 317 326 | 
             
                    lines.append("")
         | 
| 318 | 
            -
             | 
| 327 | 
            +
             | 
| 319 328 | 
             
                    # Write sections from raw content (preserves formatting)
         | 
| 320 329 | 
             
                    for section in BaseAgentSection:
         | 
| 321 330 | 
             
                        if section.value in structure.raw_sections:
         | 
| 322 331 | 
             
                            lines.append(f"## {section.value}")
         | 
| 323 332 | 
             
                            lines.append(structure.raw_sections[section.value])
         | 
| 324 333 | 
             
                            lines.append("")
         | 
| 325 | 
            -
             | 
| 326 | 
            -
                    return  | 
| 327 | 
            -
             | 
| 334 | 
            +
             | 
| 335 | 
            +
                    return "\n".join(lines)
         | 
| 336 | 
            +
             | 
| 328 337 | 
             
                def _parse_list_content(self, content: str) -> List[str]:
         | 
| 329 338 | 
             
                    """Parse list items from markdown content."""
         | 
| 330 339 | 
             
                    items = []
         | 
| 331 | 
            -
                    for line in content.split( | 
| 340 | 
            +
                    for line in content.split("\n"):
         | 
| 332 341 | 
             
                        line = line.strip()
         | 
| 333 | 
            -
                        if line.startswith( | 
| 342 | 
            +
                        if line.startswith("- "):
         | 
| 334 343 | 
             
                            items.append(line[2:].strip())
         | 
| 335 | 
            -
                        elif line.startswith( | 
| 344 | 
            +
                        elif line.startswith("* "):
         | 
| 336 345 | 
             
                            items.append(line[2:].strip())
         | 
| 337 | 
            -
                        elif line.startswith( | 
| 346 | 
            +
                        elif line.startswith("**") and line.endswith("**"):
         | 
| 338 347 | 
             
                            # Skip bold headers
         | 
| 339 348 | 
             
                            continue
         | 
| 340 349 | 
             
                    return items
         | 
| 341 | 
            -
             | 
| 350 | 
            +
             | 
| 342 351 | 
             
                def _create_backup(self) -> Path:
         | 
| 343 352 | 
             
                    """Create a timestamped backup of base_agent.md."""
         | 
| 344 353 | 
             
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
         | 
| 345 354 | 
             
                    backup_path = self.base_agent_path.parent / f"base_agent_{timestamp}.backup"
         | 
| 346 | 
            -
             | 
| 355 | 
            +
             | 
| 347 356 | 
             
                    if self.base_agent_path.exists():
         | 
| 348 | 
            -
                        content = self.base_agent_path.read_text(encoding= | 
| 349 | 
            -
                        backup_path.write_text(content, encoding= | 
| 357 | 
            +
                        content = self.base_agent_path.read_text(encoding="utf-8")
         | 
| 358 | 
            +
                        backup_path.write_text(content, encoding="utf-8")
         | 
| 350 359 | 
             
                        logger.info(f"Created backup at {backup_path}")
         | 
| 351 | 
            -
             | 
| 360 | 
            +
             | 
| 352 361 | 
             
                    return backup_path
         | 
| 353 362 |  | 
| 354 363 |  | 
| @@ -361,11 +370,11 @@ def get_base_agent_manager() -> BaseAgentManager: | |
| 361 370 | 
             
            def update_base_agent_section(section: BaseAgentSection, content: str) -> bool:
         | 
| 362 371 | 
             
                """
         | 
| 363 372 | 
             
                Quick function to update a base agent section.
         | 
| 364 | 
            -
             | 
| 373 | 
            +
             | 
| 365 374 | 
             
                Args:
         | 
| 366 375 | 
             
                    section: Section to update
         | 
| 367 376 | 
             
                    content: New content for the section
         | 
| 368 | 
            -
             | 
| 377 | 
            +
             | 
| 369 378 | 
             
                Returns:
         | 
| 370 379 | 
             
                    True if successful, False otherwise
         | 
| 371 380 | 
             
                """
         | 
| @@ -377,4 +386,4 @@ def update_base_agent_section(section: BaseAgentSection, content: str) -> bool: | |
| 377 386 | 
             
            def validate_base_agent() -> Dict[str, bool]:
         | 
| 378 387 | 
             
                """Quick function to validate base agent structure."""
         | 
| 379 388 | 
             
                manager = get_base_agent_manager()
         | 
| 380 | 
            -
                return manager.validate_structure()
         | 
| 389 | 
            +
                return manager.validate_structure()
         |