claude-mpm 3.4.10__py3-none-any.whl → 5.4.55__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +290 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1402 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +90 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2503 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +2654 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1246 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +297 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1947 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +644 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1743 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- 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 +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +132 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +278 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +483 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +570 -0
- claude_mpm/core/unified_paths.py +941 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +201 -107
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1369 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -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 +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -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/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -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 +162 -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 +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -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/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -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 +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1202 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- 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 +5 -4
- 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 +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +707 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1324 -0
- claude_mpm/services/skills/selective_skill_deployer.py +744 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1090 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +823 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.55.dist-info/METADATA +999 -0
- claude_mpm-5.4.55.dist-info/RECORD +868 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.55.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.55.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- 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 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/top_level.txt +0 -0
|
@@ -20,20 +20,29 @@ Security Considerations:
|
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
import json
|
|
23
|
-
import logging
|
|
24
|
-
from pathlib import Path
|
|
25
|
-
from typing import Dict, List, Optional, Any, Tuple
|
|
26
23
|
from dataclasses import dataclass, field
|
|
27
|
-
from datetime import datetime
|
|
28
|
-
import
|
|
29
|
-
from
|
|
24
|
+
from datetime import datetime, timezone
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
27
|
+
|
|
28
|
+
from jsonschema import Draft7Validator, ValidationError, validate
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
from claude_mpm.config.paths import paths
|
|
31
|
+
from claude_mpm.core.constants import (
|
|
32
|
+
ErrorMessages,
|
|
33
|
+
ResourceLimits,
|
|
34
|
+
SystemLimits,
|
|
35
|
+
TimeoutConfig,
|
|
36
|
+
)
|
|
37
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
38
|
+
|
|
39
|
+
logger = get_logger(__name__)
|
|
32
40
|
|
|
33
41
|
|
|
34
42
|
@dataclass
|
|
35
43
|
class ValidationResult:
|
|
36
44
|
"""Result of agent validation."""
|
|
45
|
+
|
|
37
46
|
is_valid: bool
|
|
38
47
|
errors: List[str] = field(default_factory=list)
|
|
39
48
|
warnings: List[str] = field(default_factory=list)
|
|
@@ -42,7 +51,7 @@ class ValidationResult:
|
|
|
42
51
|
|
|
43
52
|
class AgentValidator:
|
|
44
53
|
"""Validates agent configurations against JSON schema.
|
|
45
|
-
|
|
54
|
+
|
|
46
55
|
SECURITY CRITICAL: This class is the primary defense against malicious agent
|
|
47
56
|
configurations. All agent data must pass through this validator before being
|
|
48
57
|
used by the system. Bypassing this validator could lead to:
|
|
@@ -51,19 +60,36 @@ class AgentValidator:
|
|
|
51
60
|
- Data exfiltration (via file/network access)
|
|
52
61
|
- Privilege escalation (via tool combinations)
|
|
53
62
|
"""
|
|
54
|
-
|
|
63
|
+
|
|
64
|
+
# Model name mappings for normalization to tier names
|
|
65
|
+
MODEL_MAPPINGS = {
|
|
66
|
+
# Sonnet variations
|
|
67
|
+
"claude-3-5-sonnet-20241022": "sonnet",
|
|
68
|
+
"claude-3-5-sonnet-20240620": "sonnet",
|
|
69
|
+
"claude-sonnet-4-20250514": "sonnet",
|
|
70
|
+
"claude-4-sonnet-20250514": "sonnet",
|
|
71
|
+
"claude-3-sonnet-20240229": "sonnet",
|
|
72
|
+
# Opus variations
|
|
73
|
+
"claude-3-opus-20240229": "opus",
|
|
74
|
+
"claude-opus-4-20250514": "opus",
|
|
75
|
+
"claude-4-opus-20250514": "opus",
|
|
76
|
+
# Haiku variations
|
|
77
|
+
"claude-3-haiku-20240307": "haiku",
|
|
78
|
+
"claude-3-5-haiku-20241022": "haiku",
|
|
79
|
+
}
|
|
80
|
+
|
|
55
81
|
def __init__(self, schema_path: Optional[Path] = None):
|
|
56
82
|
"""Initialize the validator with the agent schema."""
|
|
57
83
|
if schema_path is None:
|
|
58
|
-
schema_path =
|
|
59
|
-
|
|
84
|
+
schema_path = paths.schemas_dir / "agent_schema.json"
|
|
85
|
+
|
|
60
86
|
self.schema_path = schema_path
|
|
61
87
|
self.schema = self._load_schema()
|
|
62
88
|
self.validator = Draft7Validator(self.schema)
|
|
63
|
-
|
|
89
|
+
|
|
64
90
|
def _load_schema(self) -> Dict[str, Any]:
|
|
65
91
|
"""Load the JSON schema from file.
|
|
66
|
-
|
|
92
|
+
|
|
67
93
|
Security Considerations:
|
|
68
94
|
- Schema file path is validated to exist and be a file
|
|
69
95
|
- JSON parsing errors are caught and logged
|
|
@@ -75,60 +101,99 @@ class AgentValidator:
|
|
|
75
101
|
raise FileNotFoundError(f"Schema file not found: {self.schema_path}")
|
|
76
102
|
if not self.schema_path.is_file():
|
|
77
103
|
raise ValueError(f"Schema path is not a file: {self.schema_path}")
|
|
78
|
-
|
|
79
|
-
with
|
|
104
|
+
|
|
105
|
+
with self.schema_path.open() as f:
|
|
80
106
|
return json.load(f)
|
|
81
107
|
except Exception as e:
|
|
82
108
|
logger.error(f"Failed to load schema from {self.schema_path}: {e}")
|
|
83
109
|
raise
|
|
84
|
-
|
|
110
|
+
|
|
111
|
+
def _normalize_model(self, model: str) -> str:
|
|
112
|
+
"""Normalize model name to standard tier (opus, sonnet, haiku).
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
model: Original model name
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
Normalized model tier name
|
|
119
|
+
"""
|
|
120
|
+
# Direct mapping check
|
|
121
|
+
if model in self.MODEL_MAPPINGS:
|
|
122
|
+
return self.MODEL_MAPPINGS[model]
|
|
123
|
+
|
|
124
|
+
# Already normalized
|
|
125
|
+
if model in {"opus", "sonnet", "haiku"}:
|
|
126
|
+
return model
|
|
127
|
+
|
|
128
|
+
# Check if model contains tier name
|
|
129
|
+
model_lower = model.lower()
|
|
130
|
+
for tier in ("opus", "sonnet", "haiku"):
|
|
131
|
+
if tier in model_lower:
|
|
132
|
+
return tier
|
|
133
|
+
|
|
134
|
+
# Default to sonnet if unrecognized
|
|
135
|
+
logger.warning(f"Unrecognized model '{model}', defaulting to 'sonnet'")
|
|
136
|
+
return "sonnet"
|
|
137
|
+
|
|
85
138
|
def validate_agent(self, agent_data: Dict[str, Any]) -> ValidationResult:
|
|
86
139
|
"""
|
|
87
140
|
Validate a single agent configuration against the schema.
|
|
88
|
-
|
|
141
|
+
|
|
89
142
|
Security Features:
|
|
90
143
|
- Strict JSON Schema validation prevents unexpected fields
|
|
91
144
|
- Business rule validation adds additional security checks
|
|
92
145
|
- Input size limits prevent memory exhaustion
|
|
93
146
|
- Agent ID format validation prevents injection attacks
|
|
94
|
-
|
|
147
|
+
|
|
95
148
|
Args:
|
|
96
149
|
agent_data: Agent configuration dictionary
|
|
97
|
-
|
|
150
|
+
|
|
98
151
|
Returns:
|
|
99
152
|
ValidationResult with validation status and any errors/warnings
|
|
100
153
|
"""
|
|
101
154
|
result = ValidationResult(is_valid=True)
|
|
102
|
-
|
|
155
|
+
|
|
156
|
+
# Normalize model name before validation
|
|
157
|
+
if "capabilities" in agent_data and "model" in agent_data["capabilities"]:
|
|
158
|
+
original_model = agent_data["capabilities"]["model"]
|
|
159
|
+
normalized_model = self._normalize_model(original_model)
|
|
160
|
+
if original_model != normalized_model:
|
|
161
|
+
agent_data["capabilities"]["model"] = normalized_model
|
|
162
|
+
result.warnings.append(
|
|
163
|
+
f"Normalized model from '{original_model}' to '{normalized_model}'"
|
|
164
|
+
)
|
|
165
|
+
|
|
103
166
|
# Perform JSON schema validation
|
|
104
167
|
try:
|
|
105
168
|
validate(instance=agent_data, schema=self.schema)
|
|
106
169
|
except ValidationError as e:
|
|
107
170
|
result.is_valid = False
|
|
108
171
|
result.errors.append(f"Schema validation error: {e.message}")
|
|
109
|
-
|
|
172
|
+
|
|
110
173
|
# Add path information if available
|
|
111
174
|
if e.path:
|
|
112
175
|
path = ".".join(str(p) for p in e.path)
|
|
113
176
|
result.errors.append(f"Error at path: {path}")
|
|
114
|
-
|
|
177
|
+
|
|
115
178
|
# SECURITY: Additional business rule validations beyond schema
|
|
116
179
|
# These provide defense-in-depth security checks
|
|
117
180
|
if result.is_valid:
|
|
118
181
|
self._validate_business_rules(agent_data, result)
|
|
119
|
-
|
|
182
|
+
|
|
120
183
|
# Add metadata
|
|
121
184
|
result.metadata = {
|
|
122
|
-
"validated_at": datetime.
|
|
185
|
+
"validated_at": datetime.now(timezone.utc).isoformat(),
|
|
123
186
|
"schema_version": self.schema.get("version", "1.1.0"),
|
|
124
|
-
"agent_id": agent_data.get("id", "unknown")
|
|
187
|
+
"agent_id": agent_data.get("id", "unknown"),
|
|
125
188
|
}
|
|
126
|
-
|
|
189
|
+
|
|
127
190
|
return result
|
|
128
|
-
|
|
129
|
-
def _validate_business_rules(
|
|
191
|
+
|
|
192
|
+
def _validate_business_rules(
|
|
193
|
+
self, agent_data: Dict[str, Any], result: ValidationResult
|
|
194
|
+
) -> None:
|
|
130
195
|
"""Apply additional business rule validations beyond schema.
|
|
131
|
-
|
|
196
|
+
|
|
132
197
|
Security Validations:
|
|
133
198
|
- Resource limits to prevent DoS attacks
|
|
134
199
|
- Instruction length limits to prevent memory exhaustion
|
|
@@ -136,46 +201,61 @@ class AgentValidator:
|
|
|
136
201
|
- Tool compatibility to prevent privilege escalation
|
|
137
202
|
- Self-reference prevention in handoff agents
|
|
138
203
|
"""
|
|
139
|
-
|
|
204
|
+
|
|
140
205
|
# Validate resource tier consistency
|
|
141
206
|
resource_tier = agent_data.get("capabilities", {}).get("resource_tier")
|
|
142
207
|
if resource_tier:
|
|
143
208
|
self._validate_resource_tier_limits(agent_data, resource_tier, result)
|
|
144
|
-
|
|
209
|
+
|
|
145
210
|
# SECURITY: Validate instruction length to prevent memory exhaustion
|
|
146
211
|
# Double-check even though schema enforces this - defense in depth
|
|
147
212
|
instructions = agent_data.get("instructions", "")
|
|
148
|
-
if len(instructions) >
|
|
149
|
-
result.errors.append(
|
|
213
|
+
if len(instructions) > SystemLimits.MAX_INSTRUCTION_LENGTH:
|
|
214
|
+
result.errors.append(
|
|
215
|
+
ErrorMessages.INSTRUCTION_TOO_LONG.format(
|
|
216
|
+
limit=SystemLimits.MAX_INSTRUCTION_LENGTH, actual=len(instructions)
|
|
217
|
+
)
|
|
218
|
+
)
|
|
150
219
|
result.is_valid = False
|
|
151
|
-
|
|
220
|
+
|
|
152
221
|
# Validate model compatibility with tools
|
|
153
222
|
self._validate_model_tool_compatibility(agent_data, result)
|
|
154
|
-
|
|
223
|
+
|
|
155
224
|
# SECURITY: Validate agent ID format to prevent injection attacks
|
|
156
225
|
# Pattern enforced: ^[a-z][a-z0-9_]*$ prevents special characters
|
|
157
226
|
agent_id = agent_data.get("id", "")
|
|
158
227
|
if agent_id.endswith("_agent"):
|
|
159
|
-
result.warnings.append(
|
|
160
|
-
|
|
228
|
+
result.warnings.append(
|
|
229
|
+
f"Agent ID '{agent_id}' contains deprecated '_agent' suffix"
|
|
230
|
+
)
|
|
231
|
+
|
|
161
232
|
# SECURITY: Additional ID validation for defense in depth
|
|
162
|
-
if agent_id and not agent_id.replace(
|
|
233
|
+
if agent_id and not agent_id.replace("_", "").replace("-", "").isalnum():
|
|
163
234
|
result.errors.append(f"Agent ID '{agent_id}' contains invalid characters")
|
|
164
235
|
result.is_valid = False
|
|
165
|
-
|
|
236
|
+
|
|
166
237
|
# SECURITY: Validate handoff agents to prevent circular references and privilege escalation
|
|
167
238
|
handoff_agents = agent_data.get("interactions", {}).get("handoff_agents", [])
|
|
168
239
|
for handoff_id in handoff_agents:
|
|
169
240
|
if handoff_id == agent_id:
|
|
170
|
-
result.warnings.append(
|
|
241
|
+
result.warnings.append(
|
|
242
|
+
f"Agent '{agent_id}' references itself in handoff_agents"
|
|
243
|
+
)
|
|
171
244
|
# SECURITY: Ensure handoff IDs follow same pattern as agent IDs
|
|
172
|
-
if
|
|
173
|
-
|
|
245
|
+
if (
|
|
246
|
+
handoff_id
|
|
247
|
+
and not handoff_id.replace("_", "").replace("-", "").isalnum()
|
|
248
|
+
):
|
|
249
|
+
result.errors.append(
|
|
250
|
+
f"Handoff agent ID '{handoff_id}' contains invalid characters"
|
|
251
|
+
)
|
|
174
252
|
result.is_valid = False
|
|
175
|
-
|
|
176
|
-
def _validate_resource_tier_limits(
|
|
253
|
+
|
|
254
|
+
def _validate_resource_tier_limits(
|
|
255
|
+
self, agent_data: Dict[str, Any], tier: str, result: ValidationResult
|
|
256
|
+
) -> None:
|
|
177
257
|
"""Validate resource limits match the tier constraints.
|
|
178
|
-
|
|
258
|
+
|
|
179
259
|
Security Purpose:
|
|
180
260
|
- Prevents resource exhaustion attacks
|
|
181
261
|
- Ensures agents can't request excessive resources
|
|
@@ -184,28 +264,28 @@ class AgentValidator:
|
|
|
184
264
|
"""
|
|
185
265
|
tier_limits = {
|
|
186
266
|
"intensive": {
|
|
187
|
-
"memory_limit":
|
|
188
|
-
"cpu_limit":
|
|
189
|
-
"timeout":
|
|
267
|
+
"memory_limit": ResourceLimits.INTENSIVE_MEMORY_RANGE,
|
|
268
|
+
"cpu_limit": ResourceLimits.INTENSIVE_CPU_RANGE,
|
|
269
|
+
"timeout": TimeoutConfig.INTENSIVE_TIMEOUT_RANGE,
|
|
190
270
|
},
|
|
191
271
|
"standard": {
|
|
192
|
-
"memory_limit":
|
|
193
|
-
"cpu_limit":
|
|
194
|
-
"timeout":
|
|
272
|
+
"memory_limit": ResourceLimits.STANDARD_MEMORY_RANGE,
|
|
273
|
+
"cpu_limit": ResourceLimits.STANDARD_CPU_RANGE,
|
|
274
|
+
"timeout": TimeoutConfig.STANDARD_TIMEOUT_RANGE,
|
|
195
275
|
},
|
|
196
276
|
"lightweight": {
|
|
197
|
-
"memory_limit":
|
|
198
|
-
"cpu_limit":
|
|
199
|
-
"timeout":
|
|
200
|
-
}
|
|
277
|
+
"memory_limit": ResourceLimits.LIGHTWEIGHT_MEMORY_RANGE,
|
|
278
|
+
"cpu_limit": ResourceLimits.LIGHTWEIGHT_CPU_RANGE,
|
|
279
|
+
"timeout": TimeoutConfig.LIGHTWEIGHT_TIMEOUT_RANGE,
|
|
280
|
+
},
|
|
201
281
|
}
|
|
202
|
-
|
|
282
|
+
|
|
203
283
|
if tier not in tier_limits:
|
|
204
284
|
return
|
|
205
|
-
|
|
285
|
+
|
|
206
286
|
limits = tier_limits[tier]
|
|
207
287
|
capabilities = agent_data.get("capabilities", {})
|
|
208
|
-
|
|
288
|
+
|
|
209
289
|
# Check memory limit
|
|
210
290
|
memory = capabilities.get("memory_limit")
|
|
211
291
|
if memory is not None:
|
|
@@ -215,7 +295,7 @@ class AgentValidator:
|
|
|
215
295
|
f"Memory limit {memory}MB outside recommended range "
|
|
216
296
|
f"{min_mem}-{max_mem}MB for tier '{tier}'"
|
|
217
297
|
)
|
|
218
|
-
|
|
298
|
+
|
|
219
299
|
# Check CPU limit
|
|
220
300
|
cpu = capabilities.get("cpu_limit")
|
|
221
301
|
if cpu is not None:
|
|
@@ -225,7 +305,7 @@ class AgentValidator:
|
|
|
225
305
|
f"CPU limit {cpu}% outside recommended range "
|
|
226
306
|
f"{min_cpu}-{max_cpu}% for tier '{tier}'"
|
|
227
307
|
)
|
|
228
|
-
|
|
308
|
+
|
|
229
309
|
# Check timeout
|
|
230
310
|
timeout = capabilities.get("timeout")
|
|
231
311
|
if timeout is not None:
|
|
@@ -235,46 +315,66 @@ class AgentValidator:
|
|
|
235
315
|
f"Timeout {timeout}s outside recommended range "
|
|
236
316
|
f"{min_timeout}-{max_timeout}s for tier '{tier}'"
|
|
237
317
|
)
|
|
238
|
-
|
|
239
|
-
def _validate_model_tool_compatibility(
|
|
318
|
+
|
|
319
|
+
def _validate_model_tool_compatibility(
|
|
320
|
+
self, agent_data: Dict[str, Any], result: ValidationResult
|
|
321
|
+
) -> None:
|
|
240
322
|
"""Validate that model and tools are compatible."""
|
|
241
323
|
model = agent_data.get("capabilities", {}).get("model", "")
|
|
242
324
|
tools = agent_data.get("capabilities", {}).get("tools", [])
|
|
243
|
-
|
|
325
|
+
|
|
326
|
+
# Normalize model name for comparison
|
|
327
|
+
normalized_model = self._normalize_model(model)
|
|
328
|
+
|
|
244
329
|
# Haiku models shouldn't use resource-intensive tools
|
|
245
|
-
if "haiku"
|
|
246
|
-
intensive_tools = {
|
|
330
|
+
if normalized_model == "haiku":
|
|
331
|
+
intensive_tools = {
|
|
332
|
+
"docker",
|
|
333
|
+
"kubectl",
|
|
334
|
+
"terraform",
|
|
335
|
+
"aws",
|
|
336
|
+
"gcloud",
|
|
337
|
+
"azure",
|
|
338
|
+
}
|
|
247
339
|
used_intensive = set(tools) & intensive_tools
|
|
248
340
|
if used_intensive:
|
|
249
341
|
result.warnings.append(
|
|
250
342
|
f"Haiku model '{model}' using resource-intensive tools: {used_intensive}"
|
|
251
343
|
)
|
|
252
|
-
|
|
344
|
+
|
|
253
345
|
# SECURITY: Network access requirement validation
|
|
254
346
|
# Ensures agents can't use network tools without explicit permission
|
|
255
347
|
network_tools = {"WebSearch", "WebFetch", "aws", "gcloud", "azure"}
|
|
256
348
|
needs_network = bool(set(tools) & network_tools)
|
|
257
349
|
has_network = agent_data.get("capabilities", {}).get("network_access", False)
|
|
258
|
-
|
|
350
|
+
|
|
259
351
|
if needs_network and not has_network:
|
|
260
352
|
result.warnings.append(
|
|
261
353
|
f"Agent uses network tools {set(tools) & network_tools} but network_access is False"
|
|
262
354
|
)
|
|
263
|
-
|
|
355
|
+
|
|
264
356
|
# SECURITY: Check for potentially dangerous tool combinations
|
|
265
357
|
dangerous_combos = [
|
|
266
|
-
(
|
|
358
|
+
(
|
|
359
|
+
{"Bash", "Write"},
|
|
360
|
+
"Can execute arbitrary code by writing and running scripts",
|
|
361
|
+
),
|
|
267
362
|
({"docker", "kubectl"}, "Container escape potential with both tools"),
|
|
268
|
-
(
|
|
363
|
+
(
|
|
364
|
+
{"aws", "gcloud", "azure"},
|
|
365
|
+
"Multiple cloud access increases attack surface",
|
|
366
|
+
),
|
|
269
367
|
]
|
|
270
|
-
|
|
368
|
+
|
|
271
369
|
for combo, risk in dangerous_combos:
|
|
272
370
|
if combo.issubset(set(tools)):
|
|
273
|
-
result.warnings.append(
|
|
274
|
-
|
|
371
|
+
result.warnings.append(
|
|
372
|
+
f"Potentially dangerous tool combination: {combo} - {risk}"
|
|
373
|
+
)
|
|
374
|
+
|
|
275
375
|
def validate_file(self, file_path: Path) -> ValidationResult:
|
|
276
376
|
"""Validate an agent configuration file.
|
|
277
|
-
|
|
377
|
+
|
|
278
378
|
Security Measures:
|
|
279
379
|
- Path traversal protection through Path object
|
|
280
380
|
- Safe JSON parsing with error handling
|
|
@@ -286,19 +386,19 @@ class AgentValidator:
|
|
|
286
386
|
raise FileNotFoundError(f"File not found: {file_path}")
|
|
287
387
|
if not file_path.is_file():
|
|
288
388
|
raise ValueError(f"Path is not a file: {file_path}")
|
|
289
|
-
|
|
389
|
+
|
|
290
390
|
# SECURITY: Check file size to prevent memory exhaustion
|
|
291
391
|
file_size = file_path.stat().st_size
|
|
292
|
-
max_size =
|
|
392
|
+
max_size = SystemLimits.MAX_AGENT_CONFIG_SIZE
|
|
293
393
|
if file_size > max_size:
|
|
294
|
-
raise ValueError(
|
|
295
|
-
with open(
|
|
394
|
+
raise ValueError(ErrorMessages.FILE_TOO_LARGE.format(limit=max_size))
|
|
395
|
+
with file_path.open() as f:
|
|
296
396
|
agent_data = json.load(f)
|
|
297
|
-
|
|
397
|
+
|
|
298
398
|
result = self.validate_agent(agent_data)
|
|
299
399
|
result.metadata["file_path"] = str(file_path)
|
|
300
400
|
return result
|
|
301
|
-
|
|
401
|
+
|
|
302
402
|
except json.JSONDecodeError as e:
|
|
303
403
|
result = ValidationResult(is_valid=False)
|
|
304
404
|
result.errors.append(f"Invalid JSON in {file_path}: {e}")
|
|
@@ -307,46 +407,48 @@ class AgentValidator:
|
|
|
307
407
|
result = ValidationResult(is_valid=False)
|
|
308
408
|
result.errors.append(f"Error reading {file_path}: {e}")
|
|
309
409
|
return result
|
|
310
|
-
|
|
410
|
+
|
|
311
411
|
def validate_directory(self, directory: Path) -> Dict[str, ValidationResult]:
|
|
312
412
|
"""Validate all agent files in a directory.
|
|
313
|
-
|
|
413
|
+
|
|
314
414
|
Security Considerations:
|
|
315
415
|
- Directory traversal prevention through Path.glob
|
|
316
416
|
- Symlink following should be disabled in production
|
|
317
417
|
- Large directory DoS prevention through file count limits
|
|
318
418
|
"""
|
|
319
419
|
results = {}
|
|
320
|
-
|
|
420
|
+
|
|
321
421
|
# SECURITY: Validate directory exists and is accessible
|
|
322
422
|
if not directory.exists():
|
|
323
423
|
raise FileNotFoundError(f"Directory not found: {directory}")
|
|
324
424
|
if not directory.is_dir():
|
|
325
425
|
raise ValueError(f"Path is not a directory: {directory}")
|
|
326
|
-
|
|
426
|
+
|
|
327
427
|
# SECURITY: Limit number of files to prevent DoS
|
|
328
|
-
max_files =
|
|
428
|
+
max_files = SystemLimits.MAX_FILES_TO_VALIDATE
|
|
329
429
|
file_count = 0
|
|
330
|
-
|
|
430
|
+
|
|
331
431
|
for json_file in directory.glob("*.json"):
|
|
332
432
|
if json_file.name == "agent_schema.json":
|
|
333
433
|
continue
|
|
334
|
-
|
|
434
|
+
|
|
335
435
|
# SECURITY: Skip symlinks to prevent directory traversal
|
|
336
436
|
if json_file.is_symlink():
|
|
337
437
|
logger.warning(f"Skipping symlink: {json_file}")
|
|
338
438
|
continue
|
|
339
|
-
|
|
439
|
+
|
|
340
440
|
file_count += 1
|
|
341
441
|
if file_count > max_files:
|
|
342
|
-
logger.warning(
|
|
442
|
+
logger.warning(
|
|
443
|
+
f"Reached maximum file limit ({max_files}), stopping validation"
|
|
444
|
+
)
|
|
343
445
|
break
|
|
344
|
-
|
|
446
|
+
|
|
345
447
|
logger.info(f"Validating {json_file}")
|
|
346
448
|
results[json_file.name] = self.validate_file(json_file)
|
|
347
|
-
|
|
449
|
+
|
|
348
450
|
return results
|
|
349
|
-
|
|
451
|
+
|
|
350
452
|
def get_schema_info(self) -> Dict[str, Any]:
|
|
351
453
|
"""Get information about the loaded schema."""
|
|
352
454
|
return {
|
|
@@ -354,32 +456,34 @@ class AgentValidator:
|
|
|
354
456
|
"schema_title": self.schema.get("title", "Unknown"),
|
|
355
457
|
"schema_description": self.schema.get("description", ""),
|
|
356
458
|
"required_fields": self.schema.get("required", []),
|
|
357
|
-
"properties": list(self.schema.get("properties", {}).keys())
|
|
459
|
+
"properties": list(self.schema.get("properties", {}).keys()),
|
|
358
460
|
}
|
|
359
461
|
|
|
360
462
|
|
|
361
|
-
def validate_agent_migration(
|
|
463
|
+
def validate_agent_migration(
|
|
464
|
+
old_agent: Dict[str, Any], new_agent: Dict[str, Any]
|
|
465
|
+
) -> ValidationResult:
|
|
362
466
|
"""
|
|
363
467
|
Validate that a migrated agent maintains compatibility.
|
|
364
|
-
|
|
468
|
+
|
|
365
469
|
Security Importance:
|
|
366
470
|
- Ensures privilege escalation doesn't occur during migration
|
|
367
471
|
- Validates that security constraints are preserved
|
|
368
472
|
- Prevents addition of dangerous tools without review
|
|
369
|
-
|
|
473
|
+
|
|
370
474
|
Args:
|
|
371
475
|
old_agent: Original agent configuration
|
|
372
476
|
new_agent: Migrated agent configuration
|
|
373
|
-
|
|
477
|
+
|
|
374
478
|
Returns:
|
|
375
479
|
ValidationResult with migration validation results
|
|
376
480
|
"""
|
|
377
481
|
result = ValidationResult(is_valid=True)
|
|
378
|
-
|
|
482
|
+
|
|
379
483
|
# SECURITY: Check that core functionality is preserved without privilege escalation
|
|
380
484
|
old_tools = set(old_agent.get("configuration_fields", {}).get("tools", []))
|
|
381
485
|
new_tools = set(new_agent.get("capabilities", {}).get("tools", []))
|
|
382
|
-
|
|
486
|
+
|
|
383
487
|
if old_tools != new_tools:
|
|
384
488
|
missing = old_tools - new_tools
|
|
385
489
|
added = new_tools - old_tools
|
|
@@ -391,19 +495,21 @@ def validate_agent_migration(old_agent: Dict[str, Any], new_agent: Dict[str, Any
|
|
|
391
495
|
dangerous_tools = {"Bash", "docker", "kubectl", "aws", "gcloud", "azure"}
|
|
392
496
|
dangerous_added = added & dangerous_tools
|
|
393
497
|
if dangerous_added:
|
|
394
|
-
result.errors.append(
|
|
498
|
+
result.errors.append(
|
|
499
|
+
f"SECURITY: Dangerous tools added in migration: {dangerous_added}"
|
|
500
|
+
)
|
|
395
501
|
result.is_valid = False
|
|
396
|
-
|
|
502
|
+
|
|
397
503
|
# Check instruction preservation
|
|
398
504
|
old_instructions = old_agent.get("narrative_fields", {}).get("instructions", "")
|
|
399
505
|
new_instructions = new_agent.get("instructions", "")
|
|
400
|
-
|
|
506
|
+
|
|
401
507
|
if old_instructions and not new_instructions:
|
|
402
508
|
result.errors.append("Instructions lost in migration")
|
|
403
509
|
result.is_valid = False
|
|
404
510
|
elif len(old_instructions) > len(new_instructions) * 1.1: # Allow 10% reduction
|
|
405
511
|
result.warnings.append("Significant instruction content reduction in migration")
|
|
406
|
-
|
|
512
|
+
|
|
407
513
|
return result
|
|
408
514
|
|
|
409
515
|
|
|
@@ -417,20 +523,20 @@ def validate_agent_file(file_path: Path) -> ValidationResult:
|
|
|
417
523
|
def validate_all_agents(directory: Path) -> Tuple[int, int, List[str]]:
|
|
418
524
|
"""
|
|
419
525
|
Validate all agents in a directory and return summary.
|
|
420
|
-
|
|
526
|
+
|
|
421
527
|
Returns:
|
|
422
528
|
Tuple of (valid_count, invalid_count, error_messages)
|
|
423
529
|
"""
|
|
424
530
|
validator = AgentValidator()
|
|
425
531
|
results = validator.validate_directory(directory)
|
|
426
|
-
|
|
532
|
+
|
|
427
533
|
valid_count = sum(1 for r in results.values() if r.is_valid)
|
|
428
534
|
invalid_count = len(results) - valid_count
|
|
429
|
-
|
|
535
|
+
|
|
430
536
|
error_messages = []
|
|
431
537
|
for filename, result in results.items():
|
|
432
538
|
if not result.is_valid:
|
|
433
539
|
for error in result.errors:
|
|
434
540
|
error_messages.append(f"{filename}: {error}")
|
|
435
|
-
|
|
436
|
-
return valid_count, invalid_count, error_messages
|
|
541
|
+
|
|
542
|
+
return valid_count, invalid_count, error_messages
|