claude-mpm 3.9.11__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 +1 -1
- 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 +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- 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 +140 -905
- 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 -1156
- 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 +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -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 +233 -199
- 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 +30 -13
- 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 +13 -20
- 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 +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- 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 +109 -119
- 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 +19 -533
- 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 +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- 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.11.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +27 -1
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- 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/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- 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.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -5,122 +5,126 @@ Validates generated content structure and completeness. | |
| 5 5 | 
             
            """
         | 
| 6 6 |  | 
| 7 7 | 
             
            import re
         | 
| 8 | 
            -
            from typing import  | 
| 8 | 
            +
            from typing import List, Set, Tuple
         | 
| 9 9 |  | 
| 10 10 |  | 
| 11 11 | 
             
            class ContentValidator:
         | 
| 12 12 | 
             
                """Validates framework CLAUDE.md content for completeness and correctness."""
         | 
| 13 | 
            -
             | 
| 13 | 
            +
             | 
| 14 14 | 
             
                # Required sections that must be present
         | 
| 15 15 | 
             
                REQUIRED_SECTIONS = [
         | 
| 16 | 
            -
                    (r | 
| 17 | 
            -
                    (r | 
| 18 | 
            -
                    (r | 
| 19 | 
            -
                    (r | 
| 20 | 
            -
                    (r | 
| 21 | 
            -
                    (r | 
| 22 | 
            -
                    (r | 
| 23 | 
            -
                    (r | 
| 24 | 
            -
                    (r | 
| 25 | 
            -
                    (r | 
| 16 | 
            +
                    (r"CLAUDE_MD_VERSION:", "Version metadata"),
         | 
| 17 | 
            +
                    (r"## 🤖 AI ASSISTANT ROLE DESIGNATION", "Role designation section"),
         | 
| 18 | 
            +
                    (r"## A\) AGENTS", "Agents section"),
         | 
| 19 | 
            +
                    (r"## B\) TODO AND TASK TOOLS", "Todo/Task tools section"),
         | 
| 20 | 
            +
                    (r"## C\) CLAUDE-PM INIT", "Claude-PM init section"),
         | 
| 21 | 
            +
                    (r"## 🚨 CORE ORCHESTRATION PRINCIPLES", "Orchestration principles"),
         | 
| 22 | 
            +
                    (r"## 🔥🚨 CRITICAL: SUBPROCESS VALIDATION PROTOCOL", "Subprocess validation"),
         | 
| 23 | 
            +
                    (r"## 🚨 CRITICAL DELEGATION CONSTRAINTS", "Delegation constraints"),
         | 
| 24 | 
            +
                    (r"## 🚨 TROUBLESHOOTING", "Troubleshooting section"),
         | 
| 25 | 
            +
                    (r"## Core Responsibilities", "Core responsibilities"),
         | 
| 26 26 | 
             
                ]
         | 
| 27 | 
            -
             | 
| 27 | 
            +
             | 
| 28 28 | 
             
                # Template variables that are allowed to remain unsubstituted for runtime
         | 
| 29 29 | 
             
                ALLOWED_RUNTIME_VARS = {
         | 
| 30 | 
            -
                     | 
| 31 | 
            -
                     | 
| 32 | 
            -
                     | 
| 33 | 
            -
                     | 
| 30 | 
            +
                    "{{DEPLOYMENT_ID}}",
         | 
| 31 | 
            +
                    "{{PLATFORM}}",
         | 
| 32 | 
            +
                    "{{PYTHON_CMD}}",
         | 
| 33 | 
            +
                    "{{PLATFORM_NOTES}}",
         | 
| 34 34 | 
             
                }
         | 
| 35 | 
            -
             | 
| 35 | 
            +
             | 
| 36 36 | 
             
                def validate_content(self, content: str) -> Tuple[bool, List[str]]:
         | 
| 37 37 | 
             
                    """
         | 
| 38 38 | 
             
                    Validate that generated content has all required sections.
         | 
| 39 | 
            -
             | 
| 39 | 
            +
             | 
| 40 40 | 
             
                    Args:
         | 
| 41 41 | 
             
                        content: Content to validate
         | 
| 42 | 
            -
             | 
| 42 | 
            +
             | 
| 43 43 | 
             
                    Returns:
         | 
| 44 44 | 
             
                        Tuple of (is_valid, list_of_issues)
         | 
| 45 45 | 
             
                    """
         | 
| 46 46 | 
             
                    issues = []
         | 
| 47 | 
            -
             | 
| 47 | 
            +
             | 
| 48 48 | 
             
                    # Check for required sections
         | 
| 49 49 | 
             
                    for pattern, section_name in self.REQUIRED_SECTIONS:
         | 
| 50 50 | 
             
                        if not re.search(pattern, content):
         | 
| 51 51 | 
             
                            issues.append(f"Missing required section: {section_name}")
         | 
| 52 | 
            -
             | 
| 52 | 
            +
             | 
| 53 53 | 
             
                    # Check for unsubstituted template variables
         | 
| 54 | 
            -
                    unsubstituted = re.findall(r | 
| 55 | 
            -
                    unexpected_vars = [ | 
| 54 | 
            +
                    unsubstituted = re.findall(r"\{\{[^}]+\}\}", content)
         | 
| 55 | 
            +
                    unexpected_vars = [
         | 
| 56 | 
            +
                        var for var in unsubstituted if var not in self.ALLOWED_RUNTIME_VARS
         | 
| 57 | 
            +
                    ]
         | 
| 56 58 | 
             
                    if unexpected_vars:
         | 
| 57 | 
            -
                        issues.append( | 
| 58 | 
            -
             | 
| 59 | 
            +
                        issues.append(
         | 
| 60 | 
            +
                            f"Unsubstituted template variables: {', '.join(set(unexpected_vars))}"
         | 
| 61 | 
            +
                        )
         | 
| 62 | 
            +
             | 
| 59 63 | 
             
                    # Validate version format - now accepts simple serial numbers
         | 
| 60 | 
            -
                    version_match = re.search(r | 
| 64 | 
            +
                    version_match = re.search(r"CLAUDE_MD_VERSION:\s*(\d+)(?:-(\d+))?", content)
         | 
| 61 65 | 
             
                    if not version_match:
         | 
| 62 66 | 
             
                        issues.append("Invalid or missing CLAUDE_MD_VERSION format")
         | 
| 63 | 
            -
             | 
| 67 | 
            +
             | 
| 64 68 | 
             
                    # Check for proper structure
         | 
| 65 69 | 
             
                    if not content.strip():
         | 
| 66 70 | 
             
                        issues.append("Content is empty")
         | 
| 67 | 
            -
             | 
| 71 | 
            +
             | 
| 68 72 | 
             
                    # Validate agent section completeness
         | 
| 69 | 
            -
                    if  | 
| 73 | 
            +
                    if "## A) AGENTS" in content:
         | 
| 70 74 | 
             
                        required_agents = [
         | 
| 71 | 
            -
                             | 
| 72 | 
            -
                             | 
| 73 | 
            -
                             | 
| 74 | 
            -
                             | 
| 75 | 
            -
                             | 
| 76 | 
            -
                             | 
| 77 | 
            -
                             | 
| 78 | 
            -
                             | 
| 79 | 
            -
                             | 
| 75 | 
            +
                            "Documentation Agent",
         | 
| 76 | 
            +
                            "Ticketing Agent",
         | 
| 77 | 
            +
                            "Version Control Agent",
         | 
| 78 | 
            +
                            "QA Agent",
         | 
| 79 | 
            +
                            "Research Agent",
         | 
| 80 | 
            +
                            "Ops Agent",
         | 
| 81 | 
            +
                            "Security Agent",
         | 
| 82 | 
            +
                            "Engineer Agent",
         | 
| 83 | 
            +
                            "Data Engineer Agent",
         | 
| 80 84 | 
             
                        ]
         | 
| 81 85 | 
             
                        for agent in required_agents:
         | 
| 82 86 | 
             
                            if agent not in content:
         | 
| 83 87 | 
             
                                issues.append(f"Missing core agent: {agent}")
         | 
| 84 | 
            -
             | 
| 88 | 
            +
             | 
| 85 89 | 
             
                    return len(issues) == 0, issues
         | 
| 86 | 
            -
             | 
| 90 | 
            +
             | 
| 87 91 | 
             
                def validate_section_order(self, sections: List[str]) -> Tuple[bool, List[str]]:
         | 
| 88 92 | 
             
                    """
         | 
| 89 93 | 
             
                    Validate that sections are in the correct order.
         | 
| 90 | 
            -
             | 
| 94 | 
            +
             | 
| 91 95 | 
             
                    Args:
         | 
| 92 96 | 
             
                        sections: List of section names in order
         | 
| 93 | 
            -
             | 
| 97 | 
            +
             | 
| 94 98 | 
             
                    Returns:
         | 
| 95 99 | 
             
                        Tuple of (is_valid, list_of_issues)
         | 
| 96 100 | 
             
                    """
         | 
| 97 101 | 
             
                    expected_order = [
         | 
| 98 | 
            -
                         | 
| 99 | 
            -
                         | 
| 100 | 
            -
                         | 
| 101 | 
            -
                         | 
| 102 | 
            -
                         | 
| 103 | 
            -
                         | 
| 104 | 
            -
                         | 
| 105 | 
            -
                         | 
| 106 | 
            -
                         | 
| 107 | 
            -
                         | 
| 108 | 
            -
                         | 
| 109 | 
            -
                         | 
| 102 | 
            +
                        "header",
         | 
| 103 | 
            +
                        "role_designation",
         | 
| 104 | 
            +
                        "agents",
         | 
| 105 | 
            +
                        "todo_task_tools",
         | 
| 106 | 
            +
                        "claude_pm_init",
         | 
| 107 | 
            +
                        "orchestration_principles",
         | 
| 108 | 
            +
                        "subprocess_validation",
         | 
| 109 | 
            +
                        "delegation_constraints",
         | 
| 110 | 
            +
                        "environment_config",
         | 
| 111 | 
            +
                        "troubleshooting",
         | 
| 112 | 
            +
                        "core_responsibilities",
         | 
| 113 | 
            +
                        "footer",
         | 
| 110 114 | 
             
                    ]
         | 
| 111 | 
            -
             | 
| 115 | 
            +
             | 
| 112 116 | 
             
                    issues = []
         | 
| 113 | 
            -
             | 
| 117 | 
            +
             | 
| 114 118 | 
             
                    # Check that all expected sections are present
         | 
| 115 119 | 
             
                    missing = set(expected_order) - set(sections)
         | 
| 116 120 | 
             
                    if missing:
         | 
| 117 121 | 
             
                        issues.append(f"Missing sections: {', '.join(missing)}")
         | 
| 118 | 
            -
             | 
| 122 | 
            +
             | 
| 119 123 | 
             
                    # Check order (only for sections that exist in both lists)
         | 
| 120 124 | 
             
                    common_sections = [s for s in sections if s in expected_order]
         | 
| 121 125 | 
             
                    expected_common = [s for s in expected_order if s in sections]
         | 
| 122 | 
            -
             | 
| 126 | 
            +
             | 
| 123 127 | 
             
                    if common_sections != expected_common:
         | 
| 124 128 | 
             
                        issues.append("Sections are not in the expected order")
         | 
| 125 | 
            -
             | 
| 126 | 
            -
                    return len(issues) == 0, issues
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                    return len(issues) == 0, issues
         | 
| @@ -1,27 +1,32 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            Deployment management for framework CLAUDE.md templates.
         | 
| 3 5 |  | 
| 4 6 | 
             
            Handles deployment operations to parent directories.
         | 
| 5 7 | 
             
            """
         | 
| 6 8 |  | 
| 7 | 
            -
            from pathlib import Path
         | 
| 8 | 
            -
            from typing import Tuple, Optional
         | 
| 9 9 | 
             
            from datetime import datetime, timezone
         | 
| 10 | 
            -
            from  | 
| 11 | 
            -
            from .content_validator import ContentValidator
         | 
| 10 | 
            +
            from typing import Optional, Tuple
         | 
| 12 11 |  | 
| 13 12 | 
             
            # Import framework detection utilities
         | 
| 14 13 | 
             
            from ...utils.framework_detection import is_framework_source_directory
         | 
| 14 | 
            +
            from .content_validator import ContentValidator
         | 
| 15 | 
            +
            from .version_manager import VersionManager
         | 
| 15 16 |  | 
| 16 17 |  | 
| 17 18 | 
             
            class DeploymentManager:
         | 
| 18 19 | 
             
                """Manages deployment of framework CLAUDE.md to parent directories."""
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                def __init__( | 
| 21 | 
            -
             | 
| 20 | 
            +
             | 
| 21 | 
            +
                def __init__(
         | 
| 22 | 
            +
                    self,
         | 
| 23 | 
            +
                    version_manager: VersionManager,
         | 
| 24 | 
            +
                    validator: ContentValidator,
         | 
| 25 | 
            +
                    target_filename: str = "INSTRUCTIONS.md",
         | 
| 26 | 
            +
                ):
         | 
| 22 27 | 
             
                    """
         | 
| 23 28 | 
             
                    Initialize deployment manager.
         | 
| 24 | 
            -
             | 
| 29 | 
            +
             | 
| 25 30 | 
             
                    Args:
         | 
| 26 31 | 
             
                        version_manager: Version management instance
         | 
| 27 32 | 
             
                        validator: Content validator instance
         | 
| @@ -31,49 +36,55 @@ class DeploymentManager: | |
| 31 36 | 
             
                    self.version_manager = version_manager
         | 
| 32 37 | 
             
                    self.validator = validator
         | 
| 33 38 | 
             
                    self.target_filename = target_filename
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                def deploy_to_parent( | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
                                    force: bool = False) -> Tuple[bool, str]:
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def deploy_to_parent(
         | 
| 41 | 
            +
                    self, content: str, parent_path: Path, force: bool = False
         | 
| 42 | 
            +
                ) -> Tuple[bool, str]:
         | 
| 39 43 | 
             
                    """
         | 
| 40 44 | 
             
                    Deploy generated content to a parent directory.
         | 
| 41 | 
            -
             | 
| 45 | 
            +
             | 
| 42 46 | 
             
                    WHY: Enhanced to ensure fresh agent capabilities generation on each deployment.
         | 
| 43 47 | 
             
                    - Checks for template variables that need processing
         | 
| 44 48 | 
             
                    - Re-processes content to get current deployed agents
         | 
| 45 49 | 
             
                    - Ensures INSTRUCTIONS.md always reflects latest agent configuration
         | 
| 46 | 
            -
             | 
| 50 | 
            +
             | 
| 47 51 | 
             
                    Args:
         | 
| 48 52 | 
             
                        content: Content to deploy
         | 
| 49 53 | 
             
                        parent_path: Path to parent directory
         | 
| 50 54 | 
             
                        force: Force deployment even if versions match
         | 
| 51 | 
            -
             | 
| 55 | 
            +
             | 
| 52 56 | 
             
                    Returns:
         | 
| 53 57 | 
             
                        Tuple of (success, message)
         | 
| 54 58 | 
             
                    """
         | 
| 55 59 | 
             
                    # Check if we're in the framework source directory
         | 
| 56 60 | 
             
                    is_framework, markers = is_framework_source_directory(parent_path)
         | 
| 57 61 | 
             
                    if is_framework:
         | 
| 58 | 
            -
                        return  | 
| 59 | 
            -
             | 
| 62 | 
            +
                        return (
         | 
| 63 | 
            +
                            True,
         | 
| 64 | 
            +
                            f"Skipping deployment - detected framework source directory (markers: {', '.join(markers)})",
         | 
| 65 | 
            +
                        )
         | 
| 66 | 
            +
             | 
| 60 67 | 
             
                    # Use configured target filename
         | 
| 61 68 | 
             
                    target_file = parent_path / self.target_filename
         | 
| 62 | 
            -
             | 
| 69 | 
            +
             | 
| 63 70 | 
             
                    # Check if content contains template variables that need processing
         | 
| 64 | 
            -
                    if  | 
| 71 | 
            +
                    if "{{capabilities-list}}" in content:
         | 
| 65 72 | 
             
                        # Content needs processing - let ContentAssembler handle it
         | 
| 66 73 | 
             
                        from .content_assembler import ContentAssembler
         | 
| 74 | 
            +
             | 
| 67 75 | 
             
                        assembler = ContentAssembler()
         | 
| 68 | 
            -
             | 
| 76 | 
            +
             | 
| 69 77 | 
             
                        # Re-process content to get fresh agent data
         | 
| 70 78 | 
             
                        # Pass content as a single section to preserve structure
         | 
| 71 79 | 
             
                        processed_content = assembler.apply_template_variables(content)
         | 
| 72 80 | 
             
                        content = processed_content
         | 
| 73 | 
            -
             | 
| 81 | 
            +
             | 
| 74 82 | 
             
                    # Validate content before deployment
         | 
| 75 83 | 
             
                    # Skip validation for INSTRUCTIONS.md format (different from CLAUDE.md)
         | 
| 76 | 
            -
                    if  | 
| 84 | 
            +
                    if (
         | 
| 85 | 
            +
                        "<!-- FRAMEWORK_VERSION:" in content
         | 
| 86 | 
            +
                        and "# Claude Multi-Agent Project Manager Instructions" in content
         | 
| 87 | 
            +
                    ):
         | 
| 77 88 | 
             
                        # This is INSTRUCTIONS.md format, skip CLAUDE.md validation
         | 
| 78 89 | 
             
                        pass
         | 
| 79 90 | 
             
                    else:
         | 
| @@ -81,82 +92,90 @@ class DeploymentManager: | |
| 81 92 | 
             
                        is_valid, issues = self.validator.validate_content(content)
         | 
| 82 93 | 
             
                        if not is_valid:
         | 
| 83 94 | 
             
                            return False, f"Validation failed: {'; '.join(issues)}"
         | 
| 84 | 
            -
             | 
| 95 | 
            +
             | 
| 85 96 | 
             
                    # Check if file exists and compare versions
         | 
| 86 97 | 
             
                    if target_file.exists() and not force:
         | 
| 87 | 
            -
                        with open(target_file,  | 
| 98 | 
            +
                        with open(target_file, "r") as f:
         | 
| 88 99 | 
             
                            existing_content = f.read()
         | 
| 89 | 
            -
                            existing_fw_ver = self.version_manager.parse_current_version( | 
| 90 | 
            -
             | 
| 100 | 
            +
                            existing_fw_ver = self.version_manager.parse_current_version(
         | 
| 101 | 
            +
                                existing_content
         | 
| 102 | 
            +
                            )
         | 
| 103 | 
            +
             | 
| 91 104 | 
             
                        if existing_fw_ver == self.version_manager.framework_version:
         | 
| 92 105 | 
             
                            return True, f"Version {existing_fw_ver} already deployed"
         | 
| 93 | 
            -
             | 
| 106 | 
            +
             | 
| 94 107 | 
             
                    # Deploy
         | 
| 95 108 | 
             
                    try:
         | 
| 96 109 | 
             
                        # Ensure parent directory exists
         | 
| 97 110 | 
             
                        parent_path.mkdir(parents=True, exist_ok=True)
         | 
| 98 | 
            -
             | 
| 111 | 
            +
             | 
| 99 112 | 
             
                        # Write content
         | 
| 100 | 
            -
                        with open(target_file,  | 
| 113 | 
            +
                        with open(target_file, "w") as f:
         | 
| 101 114 | 
             
                            f.write(content)
         | 
| 102 | 
            -
             | 
| 115 | 
            +
             | 
| 103 116 | 
             
                        # Get version info for success message
         | 
| 104 117 | 
             
                        fw_ver = self.version_manager.parse_current_version(content)
         | 
| 105 118 | 
             
                        version_str = fw_ver
         | 
| 106 | 
            -
             | 
| 119 | 
            +
             | 
| 107 120 | 
             
                        return True, f"Successfully deployed version {version_str}"
         | 
| 108 121 | 
             
                    except Exception as e:
         | 
| 109 122 | 
             
                        return False, f"Deployment failed: {str(e)}"
         | 
| 110 | 
            -
             | 
| 123 | 
            +
             | 
| 111 124 | 
             
                def check_deployment_needed(self, parent_path: Path) -> Tuple[bool, str]:
         | 
| 112 125 | 
             
                    """
         | 
| 113 126 | 
             
                    Check if deployment is needed for a parent directory.
         | 
| 114 | 
            -
             | 
| 127 | 
            +
             | 
| 115 128 | 
             
                    Args:
         | 
| 116 129 | 
             
                        parent_path: Path to parent directory
         | 
| 117 | 
            -
             | 
| 130 | 
            +
             | 
| 118 131 | 
             
                    Returns:
         | 
| 119 132 | 
             
                        Tuple of (needed, reason)
         | 
| 120 133 | 
             
                    """
         | 
| 121 134 | 
             
                    target_file = parent_path / self.target_filename
         | 
| 122 | 
            -
             | 
| 135 | 
            +
             | 
| 123 136 | 
             
                    if not target_file.exists():
         | 
| 124 137 | 
             
                        return True, f"{self.target_filename} does not exist"
         | 
| 125 | 
            -
             | 
| 138 | 
            +
             | 
| 126 139 | 
             
                    try:
         | 
| 127 | 
            -
                        with open(target_file,  | 
| 140 | 
            +
                        with open(target_file, "r") as f:
         | 
| 128 141 | 
             
                            existing_content = f.read()
         | 
| 129 | 
            -
                            existing_fw_ver = self.version_manager.parse_current_version( | 
| 130 | 
            -
             | 
| 142 | 
            +
                            existing_fw_ver = self.version_manager.parse_current_version(
         | 
| 143 | 
            +
                                existing_content
         | 
| 144 | 
            +
                            )
         | 
| 145 | 
            +
             | 
| 131 146 | 
             
                        if existing_fw_ver != self.version_manager.framework_version:
         | 
| 132 | 
            -
                            return  | 
| 133 | 
            -
             | 
| 147 | 
            +
                            return (
         | 
| 148 | 
            +
                                True,
         | 
| 149 | 
            +
                                f"Version mismatch: {existing_fw_ver} vs {self.version_manager.framework_version}",
         | 
| 150 | 
            +
                            )
         | 
| 151 | 
            +
             | 
| 134 152 | 
             
                        return False, "Already up to date"
         | 
| 135 153 | 
             
                    except Exception as e:
         | 
| 136 154 | 
             
                        return True, f"Error checking existing file: {str(e)}"
         | 
| 137 | 
            -
             | 
| 155 | 
            +
             | 
| 138 156 | 
             
                def backup_existing(self, parent_path: Path) -> Optional[Path]:
         | 
| 139 157 | 
             
                    """
         | 
| 140 158 | 
             
                    Create a backup of existing target file before deployment.
         | 
| 141 | 
            -
             | 
| 159 | 
            +
             | 
| 142 160 | 
             
                    Args:
         | 
| 143 161 | 
             
                        parent_path: Path to parent directory
         | 
| 144 | 
            -
             | 
| 162 | 
            +
             | 
| 145 163 | 
             
                    Returns:
         | 
| 146 164 | 
             
                        Path to backup file if created, None otherwise
         | 
| 147 165 | 
             
                    """
         | 
| 148 166 | 
             
                    target_file = parent_path / self.target_filename
         | 
| 149 | 
            -
             | 
| 167 | 
            +
             | 
| 150 168 | 
             
                    if not target_file.exists():
         | 
| 151 169 | 
             
                        return None
         | 
| 152 | 
            -
             | 
| 170 | 
            +
             | 
| 153 171 | 
             
                    # Create backup filename with timestamp
         | 
| 154 172 | 
             
                    timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
         | 
| 155 173 | 
             
                    backup_file = parent_path / f"{self.target_filename}.backup.{timestamp}"
         | 
| 156 | 
            -
             | 
| 174 | 
            +
             | 
| 157 175 | 
             
                    try:
         | 
| 158 176 | 
             
                        import shutil
         | 
| 177 | 
            +
             | 
| 159 178 | 
             
                        shutil.copy2(target_file, backup_file)
         | 
| 160 179 | 
             
                        return backup_file
         | 
| 161 180 | 
             
                    except Exception:
         | 
| 162 | 
            -
                        return None
         | 
| 181 | 
            +
                        return None
         | 
| @@ -4,36 +4,36 @@ Section generators for framework CLAUDE.md template. | |
| 4 4 | 
             
            This module provides base classes and registry for section generators.
         | 
| 5 5 | 
             
            """
         | 
| 6 6 |  | 
| 7 | 
            -
            from typing import Dict, Any, Optional
         | 
| 8 7 | 
             
            from abc import ABC, abstractmethod
         | 
| 9 8 | 
             
            from datetime import datetime
         | 
| 9 | 
            +
            from typing import Any, Dict, Optional
         | 
| 10 10 |  | 
| 11 11 |  | 
| 12 12 | 
             
            class BaseSectionGenerator(ABC):
         | 
| 13 13 | 
             
                """Base class for all section generators."""
         | 
| 14 | 
            -
             | 
| 14 | 
            +
             | 
| 15 15 | 
             
                def __init__(self, framework_version: str):
         | 
| 16 16 | 
             
                    """
         | 
| 17 17 | 
             
                    Initialize section generator.
         | 
| 18 | 
            -
             | 
| 18 | 
            +
             | 
| 19 19 | 
             
                    Args:
         | 
| 20 20 | 
             
                        framework_version: Current framework version
         | 
| 21 21 | 
             
                    """
         | 
| 22 22 | 
             
                    self.framework_version = framework_version
         | 
| 23 | 
            -
             | 
| 23 | 
            +
             | 
| 24 24 | 
             
                @abstractmethod
         | 
| 25 25 | 
             
                def generate(self, data: Dict[str, Any]) -> str:
         | 
| 26 26 | 
             
                    """
         | 
| 27 27 | 
             
                    Generate section content.
         | 
| 28 | 
            -
             | 
| 28 | 
            +
             | 
| 29 29 | 
             
                    Args:
         | 
| 30 30 | 
             
                        data: Section-specific data
         | 
| 31 | 
            -
             | 
| 31 | 
            +
             | 
| 32 32 | 
             
                    Returns:
         | 
| 33 33 | 
             
                        str: Generated section content
         | 
| 34 34 | 
             
                    """
         | 
| 35 35 | 
             
                    pass
         | 
| 36 | 
            -
             | 
| 36 | 
            +
             | 
| 37 37 | 
             
                def get_timestamp(self) -> str:
         | 
| 38 38 | 
             
                    """Get current UTC timestamp."""
         | 
| 39 39 | 
             
                    return datetime.utcnow().isoformat()
         | 
| @@ -41,33 +41,33 @@ class BaseSectionGenerator(ABC): | |
| 41 41 |  | 
| 42 42 | 
             
            class SectionGeneratorRegistry:
         | 
| 43 43 | 
             
                """Registry for section generators."""
         | 
| 44 | 
            -
             | 
| 44 | 
            +
             | 
| 45 45 | 
             
                def __init__(self):
         | 
| 46 46 | 
             
                    """Initialize registry."""
         | 
| 47 47 | 
             
                    self._generators = {}
         | 
| 48 | 
            -
             | 
| 48 | 
            +
             | 
| 49 49 | 
             
                def register(self, name: str, generator_class: type):
         | 
| 50 50 | 
             
                    """
         | 
| 51 51 | 
             
                    Register a section generator.
         | 
| 52 | 
            -
             | 
| 52 | 
            +
             | 
| 53 53 | 
             
                    Args:
         | 
| 54 54 | 
             
                        name: Section name
         | 
| 55 55 | 
             
                        generator_class: Generator class
         | 
| 56 56 | 
             
                    """
         | 
| 57 57 | 
             
                    self._generators[name] = generator_class
         | 
| 58 | 
            -
             | 
| 58 | 
            +
             | 
| 59 59 | 
             
                def get(self, name: str) -> Optional[type]:
         | 
| 60 60 | 
             
                    """
         | 
| 61 61 | 
             
                    Get a section generator class.
         | 
| 62 | 
            -
             | 
| 62 | 
            +
             | 
| 63 63 | 
             
                    Args:
         | 
| 64 64 | 
             
                        name: Section name
         | 
| 65 | 
            -
             | 
| 65 | 
            +
             | 
| 66 66 | 
             
                    Returns:
         | 
| 67 67 | 
             
                        Generator class or None
         | 
| 68 68 | 
             
                    """
         | 
| 69 69 | 
             
                    return self._generators.get(name)
         | 
| 70 | 
            -
             | 
| 70 | 
            +
             | 
| 71 71 | 
             
                def list_sections(self) -> list:
         | 
| 72 72 | 
             
                    """Get list of registered section names."""
         | 
| 73 73 | 
             
                    return list(self._generators.keys())
         | 
| @@ -76,31 +76,31 @@ class SectionGeneratorRegistry: | |
| 76 76 | 
             
            # Global registry instance
         | 
| 77 77 | 
             
            section_registry = SectionGeneratorRegistry()
         | 
| 78 78 |  | 
| 79 | 
            +
            from .agents import AgentsGenerator
         | 
| 80 | 
            +
            from .claude_pm_init import ClaudePmInitGenerator
         | 
| 81 | 
            +
            from .core_responsibilities import CoreResponsibilitiesGenerator
         | 
| 82 | 
            +
            from .delegation_constraints import DelegationConstraintsGenerator
         | 
| 83 | 
            +
            from .environment_config import EnvironmentConfigGenerator
         | 
| 84 | 
            +
            from .footer import FooterGenerator
         | 
| 79 85 |  | 
| 80 86 | 
             
            # Import and register all section generators
         | 
| 81 87 | 
             
            from .header import HeaderGenerator
         | 
| 82 | 
            -
            from .role_designation import RoleDesignationGenerator
         | 
| 83 | 
            -
            from .agents import AgentsGenerator
         | 
| 84 | 
            -
            from .todo_task_tools import TodoTaskToolsGenerator
         | 
| 85 | 
            -
            from .claude_pm_init import ClaudePmInitGenerator
         | 
| 86 88 | 
             
            from .orchestration_principles import OrchestrationPrinciplesGenerator
         | 
| 89 | 
            +
            from .role_designation import RoleDesignationGenerator
         | 
| 87 90 | 
             
            from .subprocess_validation import SubprocessValidationGenerator
         | 
| 88 | 
            -
            from . | 
| 89 | 
            -
            from .environment_config import EnvironmentConfigGenerator
         | 
| 91 | 
            +
            from .todo_task_tools import TodoTaskToolsGenerator
         | 
| 90 92 | 
             
            from .troubleshooting import TroubleshootingGenerator
         | 
| 91 | 
            -
            from .core_responsibilities import CoreResponsibilitiesGenerator
         | 
| 92 | 
            -
            from .footer import FooterGenerator
         | 
| 93 93 |  | 
| 94 94 | 
             
            # Register all generators
         | 
| 95 | 
            -
            section_registry.register( | 
| 96 | 
            -
            section_registry.register( | 
| 97 | 
            -
            section_registry.register( | 
| 98 | 
            -
            section_registry.register( | 
| 99 | 
            -
            section_registry.register( | 
| 100 | 
            -
            section_registry.register( | 
| 101 | 
            -
            section_registry.register( | 
| 102 | 
            -
            section_registry.register( | 
| 103 | 
            -
            section_registry.register( | 
| 104 | 
            -
            section_registry.register( | 
| 105 | 
            -
            section_registry.register( | 
| 106 | 
            -
            section_registry.register( | 
| 95 | 
            +
            section_registry.register("header", HeaderGenerator)
         | 
| 96 | 
            +
            section_registry.register("role_designation", RoleDesignationGenerator)
         | 
| 97 | 
            +
            section_registry.register("agents", AgentsGenerator)
         | 
| 98 | 
            +
            section_registry.register("todo_task_tools", TodoTaskToolsGenerator)
         | 
| 99 | 
            +
            section_registry.register("claude_pm_init", ClaudePmInitGenerator)
         | 
| 100 | 
            +
            section_registry.register("orchestration_principles", OrchestrationPrinciplesGenerator)
         | 
| 101 | 
            +
            section_registry.register("subprocess_validation", SubprocessValidationGenerator)
         | 
| 102 | 
            +
            section_registry.register("delegation_constraints", DelegationConstraintsGenerator)
         | 
| 103 | 
            +
            section_registry.register("environment_config", EnvironmentConfigGenerator)
         | 
| 104 | 
            +
            section_registry.register("troubleshooting", TroubleshootingGenerator)
         | 
| 105 | 
            +
            section_registry.register("core_responsibilities", CoreResponsibilitiesGenerator)
         | 
| 106 | 
            +
            section_registry.register("footer", FooterGenerator)
         |