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
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            Framework INSTRUCTIONS.md Generator Service
         | 
| 3 5 |  | 
| @@ -5,29 +7,28 @@ This service provides structured generation of the framework INSTRUCTIONS.md tem | |
| 5 7 | 
             
            (legacy: CLAUDE.md) with auto-versioning, section management, and deployment capabilities.
         | 
| 6 8 | 
             
            """
         | 
| 7 9 |  | 
| 8 | 
            -
            from typing import  | 
| 9 | 
            -
            from pathlib import Path
         | 
| 10 | 
            +
            from typing import Any, Dict, List, Optional, Tuple
         | 
| 10 11 |  | 
| 11 | 
            -
            from .version_manager import VersionManager
         | 
| 12 | 
            -
            from .content_validator import ContentValidator
         | 
| 13 12 | 
             
            from .content_assembler import ContentAssembler
         | 
| 13 | 
            +
            from .content_validator import ContentValidator
         | 
| 14 14 | 
             
            from .deployment_manager import DeploymentManager
         | 
| 15 | 
            -
            from .section_manager import SectionManager
         | 
| 16 15 | 
             
            from .section_generators import section_registry
         | 
| 16 | 
            +
            from .section_manager import SectionManager
         | 
| 17 | 
            +
            from .version_manager import VersionManager
         | 
| 17 18 |  | 
| 18 19 |  | 
| 19 20 | 
             
            class FrameworkClaudeMdGenerator:
         | 
| 20 21 | 
             
                """
         | 
| 21 | 
            -
                Generates and manages the framework INSTRUCTIONS.md template (legacy: CLAUDE.md) | 
| 22 | 
            +
                Generates and manages the framework INSTRUCTIONS.md template (legacy: CLAUDE.md)
         | 
| 22 23 | 
             
                with structured sections, auto-versioning, and deployment capabilities.
         | 
| 23 | 
            -
             | 
| 24 | 
            +
             | 
| 24 25 | 
             
                This is the main facade class that coordinates all the submodules.
         | 
| 25 26 | 
             
                """
         | 
| 26 | 
            -
             | 
| 27 | 
            +
             | 
| 27 28 | 
             
                def __init__(self, target_filename: str = "INSTRUCTIONS.md"):
         | 
| 28 29 | 
             
                    """
         | 
| 29 30 | 
             
                    Initialize the generator with current framework version.
         | 
| 30 | 
            -
             | 
| 31 | 
            +
             | 
| 31 32 | 
             
                    Args:
         | 
| 32 33 | 
             
                        target_filename: Target filename for deployment (default: "INSTRUCTIONS.md")
         | 
| 33 34 | 
             
                                       Can be set to "CLAUDE.md" for legacy compatibility
         | 
| @@ -37,103 +38,100 @@ class FrameworkClaudeMdGenerator: | |
| 37 38 | 
             
                    self.validator = ContentValidator()
         | 
| 38 39 | 
             
                    self.assembler = ContentAssembler()
         | 
| 39 40 | 
             
                    self.section_manager = SectionManager()
         | 
| 40 | 
            -
             | 
| 41 | 
            +
             | 
| 41 42 | 
             
                    # Initialize deployment manager with dependencies
         | 
| 42 43 | 
             
                    self.deployment_manager = DeploymentManager(
         | 
| 43 | 
            -
                        self.version_manager, 
         | 
| 44 | 
            -
                        self.validator,
         | 
| 45 | 
            -
                        target_filename=target_filename
         | 
| 44 | 
            +
                        self.version_manager, self.validator, target_filename=target_filename
         | 
| 46 45 | 
             
                    )
         | 
| 47 | 
            -
             | 
| 46 | 
            +
             | 
| 48 47 | 
             
                    # Get framework version
         | 
| 49 48 | 
             
                    self.framework_version = self.version_manager.framework_version
         | 
| 50 | 
            -
             | 
| 49 | 
            +
             | 
| 51 50 | 
             
                    # Initialize sections
         | 
| 52 51 | 
             
                    self._initialize_sections()
         | 
| 53 | 
            -
             | 
| 52 | 
            +
             | 
| 54 53 | 
             
                def _initialize_sections(self):
         | 
| 55 54 | 
             
                    """Initialize all sections in the required order."""
         | 
| 56 55 | 
             
                    # Register all default sections with their generators
         | 
| 57 56 | 
             
                    section_order = [
         | 
| 58 | 
            -
                         | 
| 59 | 
            -
                         | 
| 60 | 
            -
                         | 
| 61 | 
            -
                         | 
| 62 | 
            -
                         | 
| 63 | 
            -
                         | 
| 64 | 
            -
                         | 
| 65 | 
            -
                         | 
| 66 | 
            -
                         | 
| 67 | 
            -
                         | 
| 68 | 
            -
                         | 
| 69 | 
            -
                         | 
| 57 | 
            +
                        "header",
         | 
| 58 | 
            +
                        "role_designation",
         | 
| 59 | 
            +
                        "agents",
         | 
| 60 | 
            +
                        "todo_task_tools",
         | 
| 61 | 
            +
                        "claude_pm_init",
         | 
| 62 | 
            +
                        "orchestration_principles",
         | 
| 63 | 
            +
                        "subprocess_validation",
         | 
| 64 | 
            +
                        "delegation_constraints",
         | 
| 65 | 
            +
                        "environment_config",
         | 
| 66 | 
            +
                        "troubleshooting",
         | 
| 67 | 
            +
                        "core_responsibilities",
         | 
| 68 | 
            +
                        "footer",
         | 
| 70 69 | 
             
                    ]
         | 
| 71 | 
            -
             | 
| 70 | 
            +
             | 
| 72 71 | 
             
                    for section_name in section_order:
         | 
| 73 72 | 
             
                        generator_class = section_registry.get(section_name)
         | 
| 74 73 | 
             
                        if generator_class:
         | 
| 75 74 | 
             
                            generator_instance = generator_class(self.framework_version)
         | 
| 76 75 | 
             
                            self.section_manager.register_section(
         | 
| 77 | 
            -
                                section_name,
         | 
| 78 | 
            -
                                generator_instance.generate
         | 
| 76 | 
            +
                                section_name, generator_instance.generate
         | 
| 79 77 | 
             
                            )
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                def generate( | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 78 | 
            +
             | 
| 79 | 
            +
                def generate(
         | 
| 80 | 
            +
                    self,
         | 
| 81 | 
            +
                    current_content: Optional[str] = None,
         | 
| 82 | 
            +
                    template_variables: Optional[Dict[str, str]] = None,
         | 
| 83 | 
            +
                ) -> str:
         | 
| 84 84 | 
             
                    """
         | 
| 85 85 | 
             
                    Generate the complete INSTRUCTIONS.md/CLAUDE.md content.
         | 
| 86 | 
            -
             | 
| 86 | 
            +
             | 
| 87 87 | 
             
                    Args:
         | 
| 88 88 | 
             
                        current_content: Current INSTRUCTIONS.md/CLAUDE.md content for version parsing
         | 
| 89 89 | 
             
                        template_variables: Variables to substitute in the template
         | 
| 90 | 
            -
             | 
| 90 | 
            +
             | 
| 91 91 | 
             
                    Returns:
         | 
| 92 92 | 
             
                        str: Complete INSTRUCTIONS.md/CLAUDE.md content
         | 
| 93 93 | 
             
                    """
         | 
| 94 94 | 
             
                    # Auto-increment version if current content provided
         | 
| 95 95 | 
             
                    version = self.version_manager.auto_increment_version(current_content)
         | 
| 96 | 
            -
             | 
| 96 | 
            +
             | 
| 97 97 | 
             
                    # Create metadata for header
         | 
| 98 98 | 
             
                    metadata = self.assembler.create_metadata_dict(
         | 
| 99 | 
            -
                        version=version,
         | 
| 100 | 
            -
                        framework_version=self.framework_version
         | 
| 99 | 
            +
                        version=version, framework_version=self.framework_version
         | 
| 101 100 | 
             
                    )
         | 
| 102 | 
            -
             | 
| 101 | 
            +
             | 
| 103 102 | 
             
                    # Update header section with metadata
         | 
| 104 103 | 
             
                    sections = self.section_manager.get_sections()
         | 
| 105 | 
            -
                    if  | 
| 106 | 
            -
                        generator_func, _ = sections[ | 
| 107 | 
            -
                        sections[ | 
| 108 | 
            -
             | 
| 104 | 
            +
                    if "header" in sections:
         | 
| 105 | 
            +
                        generator_func, _ = sections["header"]
         | 
| 106 | 
            +
                        sections["header"] = (generator_func, metadata)
         | 
| 107 | 
            +
             | 
| 109 108 | 
             
                    # Assemble content
         | 
| 110 | 
            -
                    content = self.assembler.assemble_content(
         | 
| 111 | 
            -
             | 
| 112 | 
            -
                        template_variables
         | 
| 113 | 
            -
                    )
         | 
| 114 | 
            -
                    
         | 
| 109 | 
            +
                    content = self.assembler.assemble_content(sections, template_variables)
         | 
| 110 | 
            +
             | 
| 115 111 | 
             
                    return content
         | 
| 116 | 
            -
             | 
| 112 | 
            +
             | 
| 117 113 | 
             
                def validate_content(self, content: str) -> Tuple[bool, List[str]]:
         | 
| 118 114 | 
             
                    """
         | 
| 119 115 | 
             
                    Validate that generated content has all required sections.
         | 
| 120 | 
            -
             | 
| 116 | 
            +
             | 
| 121 117 | 
             
                    Args:
         | 
| 122 118 | 
             
                        content: Content to validate
         | 
| 123 | 
            -
             | 
| 119 | 
            +
             | 
| 124 120 | 
             
                    Returns:
         | 
| 125 121 | 
             
                        Tuple of (is_valid, list_of_issues)
         | 
| 126 122 | 
             
                    """
         | 
| 127 123 | 
             
                    return self.validator.validate_content(content)
         | 
| 128 | 
            -
             | 
| 129 | 
            -
                def deploy_to_parent( | 
| 124 | 
            +
             | 
| 125 | 
            +
                def deploy_to_parent(
         | 
| 126 | 
            +
                    self, parent_path: Path, force: bool = False
         | 
| 127 | 
            +
                ) -> Tuple[bool, str]:
         | 
| 130 128 | 
             
                    """
         | 
| 131 129 | 
             
                    Deploy generated content to a parent directory.
         | 
| 132 | 
            -
             | 
| 130 | 
            +
             | 
| 133 131 | 
             
                    Args:
         | 
| 134 132 | 
             
                        parent_path: Path to parent directory
         | 
| 135 133 | 
             
                        force: Force deployment even if versions match
         | 
| 136 | 
            -
             | 
| 134 | 
            +
             | 
| 137 135 | 
             
                    Returns:
         | 
| 138 136 | 
             
                        Tuple of (success, message)
         | 
| 139 137 | 
             
                    """
         | 
| @@ -143,71 +141,69 @@ class FrameworkClaudeMdGenerator: | |
| 143 141 | 
             
                    if not target_file.exists() and (parent_path / "CLAUDE.md").exists():
         | 
| 144 142 | 
             
                        target_file = parent_path / "CLAUDE.md"
         | 
| 145 143 | 
             
                    current_content = None
         | 
| 146 | 
            -
             | 
| 144 | 
            +
             | 
| 147 145 | 
             
                    if target_file.exists():
         | 
| 148 | 
            -
                        with open(target_file,  | 
| 146 | 
            +
                        with open(target_file, "r") as f:
         | 
| 149 147 | 
             
                            current_content = f.read()
         | 
| 150 | 
            -
             | 
| 148 | 
            +
             | 
| 151 149 | 
             
                    # Generate new content
         | 
| 152 150 | 
             
                    new_content = self.generate(current_content=current_content)
         | 
| 153 | 
            -
             | 
| 151 | 
            +
             | 
| 154 152 | 
             
                    # Deploy using deployment manager
         | 
| 155 | 
            -
                    return self.deployment_manager.deploy_to_parent(
         | 
| 156 | 
            -
             | 
| 157 | 
            -
                        parent_path,
         | 
| 158 | 
            -
                        force
         | 
| 159 | 
            -
                    )
         | 
| 160 | 
            -
                
         | 
| 153 | 
            +
                    return self.deployment_manager.deploy_to_parent(new_content, parent_path, force)
         | 
| 154 | 
            +
             | 
| 161 155 | 
             
                def get_section_list(self) -> List[str]:
         | 
| 162 156 | 
             
                    """
         | 
| 163 157 | 
             
                    Get list of all section names in order.
         | 
| 164 | 
            -
             | 
| 158 | 
            +
             | 
| 165 159 | 
             
                    Returns:
         | 
| 166 160 | 
             
                        List of section names
         | 
| 167 161 | 
             
                    """
         | 
| 168 162 | 
             
                    return self.section_manager.get_section_list()
         | 
| 169 | 
            -
             | 
| 163 | 
            +
             | 
| 170 164 | 
             
                def update_section(self, section_name: str, content: str) -> bool:
         | 
| 171 165 | 
             
                    """
         | 
| 172 166 | 
             
                    Update a specific section's generator to return custom content.
         | 
| 173 | 
            -
             | 
| 167 | 
            +
             | 
| 174 168 | 
             
                    Args:
         | 
| 175 169 | 
             
                        section_name: Name of section to update
         | 
| 176 170 | 
             
                        content: New content for the section
         | 
| 177 | 
            -
             | 
| 171 | 
            +
             | 
| 178 172 | 
             
                    Returns:
         | 
| 179 173 | 
             
                        bool: Success status
         | 
| 180 174 | 
             
                    """
         | 
| 181 175 | 
             
                    return self.section_manager.update_section(section_name, content)
         | 
| 182 | 
            -
             | 
| 183 | 
            -
                def add_custom_section( | 
| 176 | 
            +
             | 
| 177 | 
            +
                def add_custom_section(
         | 
| 178 | 
            +
                    self, section_name: str, content: str, after: Optional[str] = None
         | 
| 179 | 
            +
                ):
         | 
| 184 180 | 
             
                    """
         | 
| 185 181 | 
             
                    Add a custom section to the generator.
         | 
| 186 | 
            -
             | 
| 182 | 
            +
             | 
| 187 183 | 
             
                    Args:
         | 
| 188 184 | 
             
                        section_name: Name for the new section
         | 
| 189 185 | 
             
                        content: Content for the section
         | 
| 190 186 | 
             
                        after: Section name to insert after (None = append at end)
         | 
| 191 187 | 
             
                    """
         | 
| 192 188 | 
             
                    self.section_manager.add_custom_section(section_name, content, after)
         | 
| 193 | 
            -
             | 
| 189 | 
            +
             | 
| 194 190 | 
             
                # Compatibility methods to match original API
         | 
| 195 191 | 
             
                def _get_framework_version(self) -> str:
         | 
| 196 192 | 
             
                    """Get framework version (compatibility method)."""
         | 
| 197 193 | 
             
                    return self.version_manager._get_framework_version()
         | 
| 198 | 
            -
             | 
| 194 | 
            +
             | 
| 199 195 | 
             
                def _parse_current_version(self, content: str) -> Tuple[str, int]:
         | 
| 200 196 | 
             
                    """Parse current version (compatibility method)."""
         | 
| 201 197 | 
             
                    return self.version_manager.parse_current_version(content)
         | 
| 202 | 
            -
             | 
| 198 | 
            +
             | 
| 203 199 | 
             
                def _auto_increment_version(self, current_content: Optional[str] = None) -> str:
         | 
| 204 200 | 
             
                    """Auto-increment version (compatibility method)."""
         | 
| 205 201 | 
             
                    return self.version_manager.auto_increment_version(current_content)
         | 
| 206 | 
            -
             | 
| 202 | 
            +
             | 
| 207 203 | 
             
                def _generate_content_hash(self) -> str:
         | 
| 208 204 | 
             
                    """Generate content hash (compatibility method)."""
         | 
| 209 205 | 
             
                    return self.assembler.generate_content_hash()
         | 
| 210 206 |  | 
| 211 207 |  | 
| 212 208 | 
             
            # Export the main class
         | 
| 213 | 
            -
            __all__ = [ | 
| 209 | 
            +
            __all__ = ["FrameworkClaudeMdGenerator"]
         | 
| @@ -5,81 +5,83 @@ Assembles sections and applies template variable substitution. | |
| 5 5 | 
             
            """
         | 
| 6 6 |  | 
| 7 7 | 
             
            import hashlib
         | 
| 8 | 
            -
            from datetime import datetime
         | 
| 9 | 
            -
            from typing import Dict, List, Optional, Any
         | 
| 10 | 
            -
            from collections import OrderedDict
         | 
| 11 8 | 
             
            import logging
         | 
| 9 | 
            +
            from collections import OrderedDict
         | 
| 10 | 
            +
            from datetime import datetime
         | 
| 11 | 
            +
            from typing import Any, Dict, List, Optional
         | 
| 12 12 |  | 
| 13 | 
            -
            from claude_mpm.services.agents.registry import DeployedAgentDiscovery
         | 
| 14 13 | 
             
            from claude_mpm.services.agents.management import AgentCapabilitiesGenerator
         | 
| 14 | 
            +
            from claude_mpm.services.agents.registry import DeployedAgentDiscovery
         | 
| 15 15 |  | 
| 16 16 | 
             
            logger = logging.getLogger(__name__)
         | 
| 17 17 |  | 
| 18 18 |  | 
| 19 19 | 
             
            class ContentAssembler:
         | 
| 20 20 | 
             
                """Assembles framework CLAUDE.md content from sections."""
         | 
| 21 | 
            -
             | 
| 21 | 
            +
             | 
| 22 22 | 
             
                def __init__(self):
         | 
| 23 23 | 
             
                    """Initialize content assembler."""
         | 
| 24 24 | 
             
                    self.template_variables = {}
         | 
| 25 25 | 
             
                    self.agent_discovery = DeployedAgentDiscovery()
         | 
| 26 26 | 
             
                    self.capabilities_generator = AgentCapabilitiesGenerator()
         | 
| 27 | 
            -
                    logger.debug( | 
| 28 | 
            -
             | 
| 27 | 
            +
                    logger.debug(
         | 
| 28 | 
            +
                        "Initialized ContentAssembler with dynamic agent capabilities support"
         | 
| 29 | 
            +
                    )
         | 
| 30 | 
            +
             | 
| 29 31 | 
             
                def generate_content_hash(self) -> str:
         | 
| 30 32 | 
             
                    """
         | 
| 31 33 | 
             
                    Generate a content hash for integrity verification.
         | 
| 32 | 
            -
             | 
| 34 | 
            +
             | 
| 33 35 | 
             
                    Returns:
         | 
| 34 36 | 
             
                        str: 16-character hash of content
         | 
| 35 37 | 
             
                    """
         | 
| 36 38 | 
             
                    timestamp = datetime.utcnow().isoformat()
         | 
| 37 39 | 
             
                    hash_obj = hashlib.sha256(timestamp.encode())
         | 
| 38 40 | 
             
                    return hash_obj.hexdigest()[:16]
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                def assemble_content( | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 41 | 
            +
             | 
| 42 | 
            +
                def assemble_content(
         | 
| 43 | 
            +
                    self, sections: OrderedDict, template_variables: Optional[Dict[str, str]] = None
         | 
| 44 | 
            +
                ) -> str:
         | 
| 43 45 | 
             
                    """
         | 
| 44 46 | 
             
                    Assemble complete content from sections.
         | 
| 45 | 
            -
             | 
| 47 | 
            +
             | 
| 46 48 | 
             
                    Args:
         | 
| 47 49 | 
             
                        sections: OrderedDict of section_name -> (generator_func, section_data)
         | 
| 48 50 | 
             
                        template_variables: Variables to substitute in the template
         | 
| 49 | 
            -
             | 
| 51 | 
            +
             | 
| 50 52 | 
             
                    Returns:
         | 
| 51 53 | 
             
                        str: Complete assembled content
         | 
| 52 54 | 
             
                    """
         | 
| 53 55 | 
             
                    # Store template variables
         | 
| 54 56 | 
             
                    if template_variables:
         | 
| 55 57 | 
             
                        self.template_variables = template_variables
         | 
| 56 | 
            -
             | 
| 58 | 
            +
             | 
| 57 59 | 
             
                    # Generate all sections
         | 
| 58 60 | 
             
                    content_parts = []
         | 
| 59 61 | 
             
                    for section_name, (generator_func, section_data) in sections.items():
         | 
| 60 62 | 
             
                        section_content = generator_func(section_data)
         | 
| 61 63 | 
             
                        content_parts.append(section_content)
         | 
| 62 | 
            -
             | 
| 64 | 
            +
             | 
| 63 65 | 
             
                    # Join all sections
         | 
| 64 | 
            -
                    full_content =  | 
| 65 | 
            -
             | 
| 66 | 
            +
                    full_content = "\n".join(content_parts)
         | 
| 67 | 
            +
             | 
| 66 68 | 
             
                    # Apply template variable substitution
         | 
| 67 69 | 
             
                    full_content = self.apply_template_variables(full_content)
         | 
| 68 | 
            -
             | 
| 70 | 
            +
             | 
| 69 71 | 
             
                    return full_content
         | 
| 70 | 
            -
             | 
| 72 | 
            +
             | 
| 71 73 | 
             
                def apply_template_variables(self, content: str) -> str:
         | 
| 72 74 | 
             
                    """
         | 
| 73 75 | 
             
                    Apply template variable substitution to content.
         | 
| 74 | 
            -
             | 
| 76 | 
            +
             | 
| 75 77 | 
             
                    WHY: Enhanced to support dynamic agent capabilities generation.
         | 
| 76 78 | 
             
                    - Generates fresh agent capabilities on each call
         | 
| 77 79 | 
             
                    - Provides graceful fallback if generation fails
         | 
| 78 80 | 
             
                    - Ensures INSTRUCTIONS.md always reflects current deployed agents
         | 
| 79 | 
            -
             | 
| 81 | 
            +
             | 
| 80 82 | 
             
                    Args:
         | 
| 81 83 | 
             
                        content: Content with template variables
         | 
| 82 | 
            -
             | 
| 84 | 
            +
             | 
| 83 85 | 
             
                    Returns:
         | 
| 84 86 | 
             
                        str: Content with variables substituted
         | 
| 85 87 | 
             
                    """
         | 
| @@ -89,55 +91,63 @@ class ContentAssembler: | |
| 89 91 | 
             
                            # Discover deployed agents
         | 
| 90 92 | 
             
                            deployed_agents = self.agent_discovery.discover_deployed_agents()
         | 
| 91 93 | 
             
                            # Generate capabilities content
         | 
| 92 | 
            -
                            capabilities_content =  | 
| 94 | 
            +
                            capabilities_content = (
         | 
| 95 | 
            +
                                self.capabilities_generator.generate_capabilities_section(
         | 
| 96 | 
            +
                                    deployed_agents
         | 
| 97 | 
            +
                                )
         | 
| 98 | 
            +
                            )
         | 
| 93 99 | 
             
                            # Add to template variables
         | 
| 94 | 
            -
                            self.template_variables[ | 
| 95 | 
            -
                            logger.info( | 
| 100 | 
            +
                            self.template_variables["capabilities-list"] = capabilities_content
         | 
| 101 | 
            +
                            logger.info(
         | 
| 102 | 
            +
                                f"Generated dynamic capabilities for {len(deployed_agents)} agents"
         | 
| 103 | 
            +
                            )
         | 
| 96 104 | 
             
                        except Exception as e:
         | 
| 97 105 | 
             
                            logger.error(f"Failed to generate dynamic capabilities: {e}")
         | 
| 98 106 | 
             
                            # Fallback is handled by the generator's internal fallback mechanism
         | 
| 99 | 
            -
             | 
| 107 | 
            +
             | 
| 100 108 | 
             
                    # Apply all template variables
         | 
| 101 109 | 
             
                    for var_name, var_value in self.template_variables.items():
         | 
| 102 110 | 
             
                        placeholder = f"{{{{{var_name}}}}}"
         | 
| 103 111 | 
             
                        content = content.replace(placeholder, var_value)
         | 
| 104 | 
            -
             | 
| 112 | 
            +
             | 
| 105 113 | 
             
                    return content
         | 
| 106 | 
            -
             | 
| 107 | 
            -
                def merge_sections( | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 114 | 
            +
             | 
| 115 | 
            +
                def merge_sections(
         | 
| 116 | 
            +
                    self, base_sections: OrderedDict, custom_sections: Dict[str, tuple]
         | 
| 117 | 
            +
                ) -> OrderedDict:
         | 
| 110 118 | 
             
                    """
         | 
| 111 119 | 
             
                    Merge custom sections with base sections.
         | 
| 112 | 
            -
             | 
| 120 | 
            +
             | 
| 113 121 | 
             
                    Args:
         | 
| 114 122 | 
             
                        base_sections: Base section definitions
         | 
| 115 123 | 
             
                        custom_sections: Custom sections to merge
         | 
| 116 | 
            -
             | 
| 124 | 
            +
             | 
| 117 125 | 
             
                    Returns:
         | 
| 118 126 | 
             
                        OrderedDict: Merged sections
         | 
| 119 127 | 
             
                    """
         | 
| 120 128 | 
             
                    merged = OrderedDict(base_sections)
         | 
| 121 | 
            -
             | 
| 129 | 
            +
             | 
| 122 130 | 
             
                    for section_name, section_def in custom_sections.items():
         | 
| 123 131 | 
             
                        merged[section_name] = section_def
         | 
| 124 | 
            -
             | 
| 132 | 
            +
             | 
| 125 133 | 
             
                    return merged
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                def insert_section_after( | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 134 | 
            +
             | 
| 135 | 
            +
                def insert_section_after(
         | 
| 136 | 
            +
                    self,
         | 
| 137 | 
            +
                    sections: OrderedDict,
         | 
| 138 | 
            +
                    new_section_name: str,
         | 
| 139 | 
            +
                    new_section_def: tuple,
         | 
| 140 | 
            +
                    after_section: str,
         | 
| 141 | 
            +
                ) -> OrderedDict:
         | 
| 132 142 | 
             
                    """
         | 
| 133 143 | 
             
                    Insert a new section after a specified section.
         | 
| 134 | 
            -
             | 
| 144 | 
            +
             | 
| 135 145 | 
             
                    Args:
         | 
| 136 146 | 
             
                        sections: Current sections
         | 
| 137 147 | 
             
                        new_section_name: Name of new section
         | 
| 138 148 | 
             
                        new_section_def: Definition tuple for new section
         | 
| 139 149 | 
             
                        after_section: Section to insert after
         | 
| 140 | 
            -
             | 
| 150 | 
            +
             | 
| 141 151 | 
             
                    Returns:
         | 
| 142 152 | 
             
                        OrderedDict: Updated sections
         | 
| 143 153 | 
             
                    """
         | 
| @@ -145,36 +155,35 @@ class ContentAssembler: | |
| 145 155 | 
             
                        # If target section doesn't exist, just append
         | 
| 146 156 | 
             
                        sections[new_section_name] = new_section_def
         | 
| 147 157 | 
             
                        return sections
         | 
| 148 | 
            -
             | 
| 158 | 
            +
             | 
| 149 159 | 
             
                    new_sections = OrderedDict()
         | 
| 150 160 | 
             
                    for key, value in sections.items():
         | 
| 151 161 | 
             
                        new_sections[key] = value
         | 
| 152 162 | 
             
                        if key == after_section:
         | 
| 153 163 | 
             
                            new_sections[new_section_name] = new_section_def
         | 
| 154 | 
            -
             | 
| 164 | 
            +
             | 
| 155 165 | 
             
                    return new_sections
         | 
| 156 | 
            -
             | 
| 157 | 
            -
                def create_metadata_dict( | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
                                       content_hash: Optional[str] = None) -> Dict[str, Any]:
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                def create_metadata_dict(
         | 
| 168 | 
            +
                    self, version: str, framework_version: str, content_hash: Optional[str] = None
         | 
| 169 | 
            +
                ) -> Dict[str, Any]:
         | 
| 161 170 | 
             
                    """
         | 
| 162 171 | 
             
                    Create metadata dictionary for header generation.
         | 
| 163 | 
            -
             | 
| 172 | 
            +
             | 
| 164 173 | 
             
                    Args:
         | 
| 165 174 | 
             
                        version: CLAUDE_MD_VERSION string
         | 
| 166 175 | 
             
                        framework_version: Framework version
         | 
| 167 176 | 
             
                        content_hash: Optional content hash
         | 
| 168 | 
            -
             | 
| 177 | 
            +
             | 
| 169 178 | 
             
                    Returns:
         | 
| 170 179 | 
             
                        Dict: Metadata for header
         | 
| 171 180 | 
             
                    """
         | 
| 172 181 | 
             
                    timestamp = datetime.utcnow().isoformat()
         | 
| 173 | 
            -
             | 
| 182 | 
            +
             | 
| 174 183 | 
             
                    return {
         | 
| 175 | 
            -
                         | 
| 176 | 
            -
                         | 
| 177 | 
            -
                         | 
| 178 | 
            -
                         | 
| 179 | 
            -
                         | 
| 180 | 
            -
                    }
         | 
| 184 | 
            +
                        "version": version,
         | 
| 185 | 
            +
                        "framework_version": framework_version,
         | 
| 186 | 
            +
                        "deployment_date": timestamp,
         | 
| 187 | 
            +
                        "last_updated": timestamp,
         | 
| 188 | 
            +
                        "content_hash": content_hash or self.generate_content_hash(),
         | 
| 189 | 
            +
                    }
         |