claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -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/experimental/cli_enhancements.py +1 -5
- 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/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.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 +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- 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_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- 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 +1094 -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/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -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 +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -420,7 +420,7 @@ class SessionPauseManager:
|
|
|
420
420
|
try:
|
|
421
421
|
latest_file = self.pause_dir / "LATEST-SESSION.txt"
|
|
422
422
|
content = f"""Latest Session: {session_id}
|
|
423
|
-
Paused At: {datetime.now(timezone.utc).strftime(
|
|
423
|
+
Paused At: {datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S %Z")}
|
|
424
424
|
Project: {self.project_path}
|
|
425
425
|
|
|
426
426
|
Files:
|
|
@@ -4,11 +4,13 @@ This service handles:
|
|
|
4
4
|
1. Copying command markdown files from source to user's ~/.claude/commands directory
|
|
5
5
|
2. Creating the commands directory if it doesn't exist
|
|
6
6
|
3. Overwriting existing commands to ensure they're up-to-date
|
|
7
|
+
4. Parsing and validating YAML frontmatter for namespace metadata (Phase 1 - 1M-400)
|
|
7
8
|
"""
|
|
8
9
|
|
|
9
|
-
import shutil
|
|
10
10
|
from pathlib import Path
|
|
11
|
-
from typing import Any, Dict, List
|
|
11
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
12
|
+
|
|
13
|
+
import yaml
|
|
12
14
|
|
|
13
15
|
from claude_mpm.core.base_service import BaseService
|
|
14
16
|
from claude_mpm.core.logger import get_logger
|
|
@@ -17,6 +19,20 @@ from claude_mpm.core.logger import get_logger
|
|
|
17
19
|
class CommandDeploymentService(BaseService):
|
|
18
20
|
"""Service for deploying MPM slash commands."""
|
|
19
21
|
|
|
22
|
+
# Deprecated commands that have been replaced (cleanup on startup)
|
|
23
|
+
DEPRECATED_COMMANDS = [
|
|
24
|
+
"mpm-agents.md", # Replaced by mpm-agents-list.md
|
|
25
|
+
"mpm-auto-configure.md", # Replaced by mpm-agents-auto-configure.md
|
|
26
|
+
"mpm-config-view.md", # Replaced by mpm-config.md
|
|
27
|
+
"mpm-resume.md", # Replaced by mpm-session-resume.md
|
|
28
|
+
"mpm-ticket.md", # Replaced by mpm-ticket-view.md
|
|
29
|
+
# Removed - consolidated into /mpm-configure
|
|
30
|
+
"mpm-agents-list.md", # Consolidated into /mpm-configure
|
|
31
|
+
"mpm-agents-detect.md", # Consolidated into /mpm-configure
|
|
32
|
+
"mpm-agents-auto-configure.md", # Consolidated into /mpm-configure
|
|
33
|
+
"mpm-agents-recommend.md", # Consolidated into /mpm-configure
|
|
34
|
+
]
|
|
35
|
+
|
|
20
36
|
def __init__(self):
|
|
21
37
|
"""Initialize the command deployment service."""
|
|
22
38
|
super().__init__(name="command_deployment")
|
|
@@ -39,6 +55,106 @@ class CommandDeploymentService(BaseService):
|
|
|
39
55
|
async def _cleanup(self) -> None:
|
|
40
56
|
"""Cleanup service resources."""
|
|
41
57
|
|
|
58
|
+
def _parse_frontmatter(self, content: str) -> Tuple[Optional[Dict[str, Any]], str]:
|
|
59
|
+
"""Parse YAML frontmatter from command file.
|
|
60
|
+
|
|
61
|
+
Ticket: 1M-400 Phase 1 - Enhanced Flat Naming with Namespace Metadata
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
content: Command file content
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Tuple of (frontmatter_dict, content_without_frontmatter)
|
|
68
|
+
If no frontmatter found, returns (None, original_content)
|
|
69
|
+
"""
|
|
70
|
+
if not content.startswith("---\n"):
|
|
71
|
+
return None, content
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
# Split on closing ---
|
|
75
|
+
parts = content.split("\n---\n", 1)
|
|
76
|
+
if len(parts) != 2:
|
|
77
|
+
return None, content
|
|
78
|
+
|
|
79
|
+
frontmatter_str = parts[0].replace("---\n", "", 1)
|
|
80
|
+
body = parts[1]
|
|
81
|
+
|
|
82
|
+
frontmatter = yaml.safe_load(frontmatter_str)
|
|
83
|
+
return frontmatter, body
|
|
84
|
+
except yaml.YAMLError as e:
|
|
85
|
+
self.logger.warning(f"YAML parsing error: {e}")
|
|
86
|
+
return None, content
|
|
87
|
+
|
|
88
|
+
def _validate_frontmatter(
|
|
89
|
+
self, frontmatter: Dict[str, Any], filepath: Path
|
|
90
|
+
) -> List[str]:
|
|
91
|
+
"""Validate frontmatter schema.
|
|
92
|
+
|
|
93
|
+
Ticket: 1M-400 Phase 1 - Enhanced Flat Naming with Namespace Metadata
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
frontmatter: Parsed frontmatter dictionary
|
|
97
|
+
filepath: Path to command file (for error reporting)
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
List of validation errors (empty if valid)
|
|
101
|
+
"""
|
|
102
|
+
errors = []
|
|
103
|
+
required_fields = ["namespace", "command", "category", "description"]
|
|
104
|
+
|
|
105
|
+
for field in required_fields:
|
|
106
|
+
if field not in frontmatter:
|
|
107
|
+
errors.append(f"Missing required field: {field}")
|
|
108
|
+
|
|
109
|
+
# Validate category
|
|
110
|
+
valid_categories = ["agents", "config", "tickets", "session", "system"]
|
|
111
|
+
if (
|
|
112
|
+
"category" in frontmatter
|
|
113
|
+
and frontmatter["category"] not in valid_categories
|
|
114
|
+
):
|
|
115
|
+
errors.append(
|
|
116
|
+
f"Invalid category: {frontmatter['category']} "
|
|
117
|
+
f"(must be one of {valid_categories})"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Validate data types
|
|
121
|
+
if "aliases" in frontmatter and not isinstance(frontmatter["aliases"], list):
|
|
122
|
+
errors.append("Field 'aliases' must be a list")
|
|
123
|
+
|
|
124
|
+
if "deprecated_aliases" in frontmatter and not isinstance(
|
|
125
|
+
frontmatter["deprecated_aliases"], list
|
|
126
|
+
):
|
|
127
|
+
errors.append("Field 'deprecated_aliases' must be a list")
|
|
128
|
+
|
|
129
|
+
return errors
|
|
130
|
+
|
|
131
|
+
def _strip_deprecated_aliases(self, content: str) -> str:
|
|
132
|
+
"""Strip deprecated_aliases from frontmatter to hide them from Claude Code UI.
|
|
133
|
+
|
|
134
|
+
This prevents deprecated aliases from appearing in the command list while
|
|
135
|
+
maintaining backward compatibility through command routing.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
content: Command file content with frontmatter
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
Content with deprecated_aliases removed from frontmatter
|
|
142
|
+
"""
|
|
143
|
+
frontmatter, body = self._parse_frontmatter(content)
|
|
144
|
+
|
|
145
|
+
if not frontmatter or "deprecated_aliases" not in frontmatter:
|
|
146
|
+
return content
|
|
147
|
+
|
|
148
|
+
# Remove deprecated_aliases from frontmatter
|
|
149
|
+
frontmatter_copy = frontmatter.copy()
|
|
150
|
+
del frontmatter_copy["deprecated_aliases"]
|
|
151
|
+
|
|
152
|
+
# Reconstruct the file with modified frontmatter
|
|
153
|
+
frontmatter_yaml = yaml.dump(
|
|
154
|
+
frontmatter_copy, default_flow_style=False, sort_keys=False
|
|
155
|
+
)
|
|
156
|
+
return f"---\n{frontmatter_yaml}---\n{body}"
|
|
157
|
+
|
|
42
158
|
def deploy_commands(self, force: bool = False) -> Dict[str, Any]:
|
|
43
159
|
"""Deploy MPM slash commands to user's Claude configuration.
|
|
44
160
|
|
|
@@ -83,6 +199,21 @@ class CommandDeploymentService(BaseService):
|
|
|
83
199
|
target_file = self.target_dir / source_file.name
|
|
84
200
|
|
|
85
201
|
try:
|
|
202
|
+
# Validate frontmatter if present (1M-400 Phase 1)
|
|
203
|
+
content = source_file.read_text()
|
|
204
|
+
frontmatter, _ = self._parse_frontmatter(content)
|
|
205
|
+
|
|
206
|
+
if frontmatter:
|
|
207
|
+
validation_errors = self._validate_frontmatter(
|
|
208
|
+
frontmatter, source_file
|
|
209
|
+
)
|
|
210
|
+
if validation_errors:
|
|
211
|
+
self.logger.warning(
|
|
212
|
+
f"Frontmatter validation issues in {source_file.name}: "
|
|
213
|
+
f"{'; '.join(validation_errors)}"
|
|
214
|
+
)
|
|
215
|
+
# Continue deployment but log warnings
|
|
216
|
+
|
|
86
217
|
# Check if file exists and if we should overwrite
|
|
87
218
|
if (
|
|
88
219
|
target_file.exists()
|
|
@@ -94,8 +225,12 @@ class CommandDeploymentService(BaseService):
|
|
|
94
225
|
)
|
|
95
226
|
continue
|
|
96
227
|
|
|
97
|
-
#
|
|
98
|
-
|
|
228
|
+
# Strip deprecated_aliases from content before deployment
|
|
229
|
+
# This prevents them from appearing in Claude Code's command list UI
|
|
230
|
+
cleaned_content = self._strip_deprecated_aliases(content)
|
|
231
|
+
|
|
232
|
+
# Write the cleaned content to target
|
|
233
|
+
target_file.write_text(cleaned_content)
|
|
99
234
|
self.logger.info(f"Deployed command: {source_file.name}")
|
|
100
235
|
result["deployed"].append(source_file.name)
|
|
101
236
|
|
|
@@ -161,21 +296,151 @@ class CommandDeploymentService(BaseService):
|
|
|
161
296
|
|
|
162
297
|
return removed
|
|
163
298
|
|
|
299
|
+
def remove_deprecated_commands(self) -> int:
|
|
300
|
+
"""Remove deprecated MPM commands that have been replaced.
|
|
301
|
+
|
|
302
|
+
This method cleans up old command files that have been superseded by
|
|
303
|
+
new hierarchical command names. It's called automatically on startup
|
|
304
|
+
to ensure users don't have both old and new versions.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
Number of deprecated files removed
|
|
308
|
+
"""
|
|
309
|
+
if not self.target_dir.exists():
|
|
310
|
+
self.logger.debug(
|
|
311
|
+
f"Target directory does not exist: {self.target_dir}, skipping deprecated command cleanup"
|
|
312
|
+
)
|
|
313
|
+
return 0
|
|
314
|
+
|
|
315
|
+
removed = 0
|
|
316
|
+
self.logger.info("Cleaning up deprecated commands...")
|
|
317
|
+
|
|
318
|
+
# Mapping of deprecated commands to their replacements for informative logging
|
|
319
|
+
replacement_map = {
|
|
320
|
+
"mpm-agents.md": "mpm-agents-list.md",
|
|
321
|
+
"mpm-auto-configure.md": "mpm-agents-auto-configure.md",
|
|
322
|
+
"mpm-config-view.md": "mpm-config.md",
|
|
323
|
+
"mpm-resume.md": "mpm-session-resume.md",
|
|
324
|
+
"mpm-ticket.md": "mpm-ticket-view.md",
|
|
325
|
+
# Removed commands - consolidated into /mpm-configure
|
|
326
|
+
"mpm-agents-list.md": "mpm-configure (use /mpm-configure)",
|
|
327
|
+
"mpm-agents-detect.md": "mpm-configure (use /mpm-configure)",
|
|
328
|
+
"mpm-agents-auto-configure.md": "mpm-configure (use /mpm-configure)",
|
|
329
|
+
"mpm-agents-recommend.md": "mpm-configure (use /mpm-configure)",
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
for deprecated_cmd in self.DEPRECATED_COMMANDS:
|
|
333
|
+
deprecated_file = self.target_dir / deprecated_cmd
|
|
334
|
+
replacement = replacement_map.get(deprecated_cmd, "a newer command")
|
|
335
|
+
|
|
336
|
+
if deprecated_file.exists():
|
|
337
|
+
try:
|
|
338
|
+
deprecated_file.unlink()
|
|
339
|
+
self.logger.debug(
|
|
340
|
+
f"Removed deprecated command: {deprecated_cmd} (replaced by {replacement})"
|
|
341
|
+
)
|
|
342
|
+
removed += 1
|
|
343
|
+
except Exception as e:
|
|
344
|
+
# Log error but don't fail startup - this is non-critical
|
|
345
|
+
self.logger.warning(
|
|
346
|
+
f"Failed to remove deprecated command {deprecated_cmd}: {e}"
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
if removed > 0:
|
|
350
|
+
self.logger.info(f"Removed {removed} deprecated command(s)")
|
|
351
|
+
else:
|
|
352
|
+
self.logger.debug("No deprecated commands found to remove")
|
|
353
|
+
|
|
354
|
+
return removed
|
|
355
|
+
|
|
356
|
+
def remove_stale_commands(self) -> int:
|
|
357
|
+
"""Remove stale MPM commands that no longer exist in source.
|
|
358
|
+
|
|
359
|
+
This method cleans up deployed commands that have been deleted or renamed
|
|
360
|
+
in the source directory. It's called automatically on startup to ensure
|
|
361
|
+
deployed commands stay in sync with source.
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
Number of stale files removed
|
|
365
|
+
"""
|
|
366
|
+
if not self.target_dir.exists():
|
|
367
|
+
self.logger.debug(
|
|
368
|
+
f"Target directory does not exist: {self.target_dir}, skipping stale command cleanup"
|
|
369
|
+
)
|
|
370
|
+
return 0
|
|
371
|
+
|
|
372
|
+
if not self.source_dir.exists():
|
|
373
|
+
self.logger.warning(
|
|
374
|
+
f"Source directory does not exist: {self.source_dir}, cannot detect stale commands"
|
|
375
|
+
)
|
|
376
|
+
return 0
|
|
377
|
+
|
|
378
|
+
# Get current source commands (ground truth)
|
|
379
|
+
source_commands = {f.name for f in self.source_dir.glob("mpm*.md")}
|
|
380
|
+
|
|
381
|
+
# Get deployed commands
|
|
382
|
+
deployed_commands = {f.name for f in self.target_dir.glob("mpm*.md")}
|
|
383
|
+
|
|
384
|
+
# Find stale commands (deployed but not in source, excluding deprecated)
|
|
385
|
+
stale_commands = (
|
|
386
|
+
deployed_commands - source_commands - set(self.DEPRECATED_COMMANDS)
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
if not stale_commands:
|
|
390
|
+
self.logger.debug("No stale commands found to remove")
|
|
391
|
+
return 0
|
|
392
|
+
|
|
393
|
+
removed = 0
|
|
394
|
+
self.logger.info(f"Cleaning up {len(stale_commands)} stale command(s)...")
|
|
395
|
+
|
|
396
|
+
for stale_cmd in stale_commands:
|
|
397
|
+
stale_file = self.target_dir / stale_cmd
|
|
398
|
+
try:
|
|
399
|
+
stale_file.unlink()
|
|
400
|
+
self.logger.info(
|
|
401
|
+
f"Removed stale command: {stale_cmd} (no longer in source)"
|
|
402
|
+
)
|
|
403
|
+
removed += 1
|
|
404
|
+
except Exception as e:
|
|
405
|
+
# Log error but don't fail startup - this is non-critical
|
|
406
|
+
self.logger.warning(f"Failed to remove stale command {stale_cmd}: {e}")
|
|
407
|
+
|
|
408
|
+
if removed > 0:
|
|
409
|
+
self.logger.info(f"Removed {removed} stale command(s)")
|
|
410
|
+
|
|
411
|
+
return removed
|
|
412
|
+
|
|
164
413
|
|
|
165
414
|
def deploy_commands_on_startup(force: bool = False) -> None:
|
|
166
415
|
"""Convenience function to deploy commands during startup.
|
|
167
416
|
|
|
417
|
+
This function:
|
|
418
|
+
1. Removes deprecated commands that have been replaced
|
|
419
|
+
2. Removes stale commands that no longer exist in source
|
|
420
|
+
3. Deploys current command files
|
|
421
|
+
|
|
168
422
|
Args:
|
|
169
423
|
force: Force deployment even if files exist
|
|
170
424
|
"""
|
|
171
425
|
service = CommandDeploymentService()
|
|
426
|
+
logger = get_logger("startup")
|
|
427
|
+
|
|
428
|
+
# Clean up deprecated commands FIRST (known old commands)
|
|
429
|
+
deprecated_count = service.remove_deprecated_commands()
|
|
430
|
+
if deprecated_count > 0:
|
|
431
|
+
logger.info(f"Cleaned up {deprecated_count} deprecated command(s)")
|
|
432
|
+
|
|
433
|
+
# Clean up stale commands SECOND (deployed but not in source anymore)
|
|
434
|
+
stale_count = service.remove_stale_commands()
|
|
435
|
+
if stale_count > 0:
|
|
436
|
+
logger.info(f"Cleaned up {stale_count} stale command(s)")
|
|
437
|
+
|
|
438
|
+
# Deploy current commands LAST
|
|
172
439
|
result = service.deploy_commands(force=force)
|
|
173
440
|
|
|
174
441
|
if result["deployed"]:
|
|
175
|
-
logger = get_logger("startup")
|
|
176
442
|
logger.info(f"MPM commands deployed: {', '.join(result['deployed'])}")
|
|
177
443
|
|
|
178
444
|
if result["errors"]:
|
|
179
|
-
logger = get_logger("startup")
|
|
180
445
|
for error in result["errors"]:
|
|
181
446
|
logger.warning(f"Command deployment issue: {error}")
|
claude_mpm/services/core/base.py
CHANGED
|
@@ -224,10 +224,11 @@ class SingletonService(SyncBaseService):
|
|
|
224
224
|
|
|
225
225
|
Ensures only one instance of the service exists with thread-safe initialization.
|
|
226
226
|
Uses double-checked locking pattern to prevent race conditions.
|
|
227
|
+
Uses RLock (reentrant lock) to support recursive instantiation patterns.
|
|
227
228
|
"""
|
|
228
229
|
|
|
229
230
|
_instances: Dict[type, "SingletonService"] = {}
|
|
230
|
-
_lock = threading.
|
|
231
|
+
_lock = threading.RLock()
|
|
231
232
|
|
|
232
233
|
def __new__(cls, *args, **kwargs):
|
|
233
234
|
"""Ensure only one instance exists with thread-safe initialization."""
|
|
@@ -247,7 +248,11 @@ class SingletonService(SyncBaseService):
|
|
|
247
248
|
# Slow path - acquire lock and double-check
|
|
248
249
|
with cls._lock:
|
|
249
250
|
if cls not in cls._instances:
|
|
250
|
-
|
|
251
|
+
# Use object.__new__ to bypass __new__ recursion
|
|
252
|
+
instance = object.__new__(cls)
|
|
253
|
+
cls._instances[cls] = instance
|
|
254
|
+
# Call __init__ explicitly after storing instance
|
|
255
|
+
instance.__init__()
|
|
251
256
|
return cls._instances[cls]
|
|
252
257
|
|
|
253
258
|
@classmethod
|
|
@@ -87,9 +87,7 @@ from .process import ( # Process lifecycle; State persistence
|
|
|
87
87
|
)
|
|
88
88
|
|
|
89
89
|
# Project interfaces (project analysis and toolchain detection)
|
|
90
|
-
from .project import
|
|
91
|
-
IToolchainAnalyzer,
|
|
92
|
-
)
|
|
90
|
+
from .project import IToolchainAnalyzer # Toolchain analysis
|
|
93
91
|
|
|
94
92
|
# Restart interfaces (auto-restart management)
|
|
95
93
|
from .restart import ( # Crash detection; Restart policy; Restart orchestration
|
|
@@ -29,10 +29,7 @@ USAGE:
|
|
|
29
29
|
from abc import ABC, abstractmethod
|
|
30
30
|
from typing import List
|
|
31
31
|
|
|
32
|
-
from claude_mpm.services.core.models.health import
|
|
33
|
-
DeploymentHealth,
|
|
34
|
-
HealthCheckResult,
|
|
35
|
-
)
|
|
32
|
+
from claude_mpm.services.core.models.health import DeploymentHealth, HealthCheckResult
|
|
36
33
|
|
|
37
34
|
|
|
38
35
|
class IHealthCheck(ABC):
|
|
@@ -27,17 +27,8 @@ from .process import (
|
|
|
27
27
|
StartConfig,
|
|
28
28
|
is_port_protected,
|
|
29
29
|
)
|
|
30
|
-
from .restart import
|
|
31
|
-
|
|
32
|
-
RestartAttempt,
|
|
33
|
-
RestartConfig,
|
|
34
|
-
RestartHistory,
|
|
35
|
-
)
|
|
36
|
-
from .stability import (
|
|
37
|
-
LogPatternMatch,
|
|
38
|
-
MemoryTrend,
|
|
39
|
-
ResourceUsage,
|
|
40
|
-
)
|
|
30
|
+
from .restart import CircuitBreakerState, RestartAttempt, RestartConfig, RestartHistory
|
|
31
|
+
from .stability import LogPatternMatch, MemoryTrend, ResourceUsage
|
|
41
32
|
from .toolchain import (
|
|
42
33
|
ConfidenceLevel,
|
|
43
34
|
DeploymentTarget,
|
|
@@ -6,6 +6,7 @@ diagnostic components.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from .agent_check import AgentCheck
|
|
9
|
+
from .agent_sources_check import AgentSourcesCheck
|
|
9
10
|
from .base_check import BaseDiagnosticCheck
|
|
10
11
|
from .claude_code_check import ClaudeCodeCheck
|
|
11
12
|
from .common_issues_check import CommonIssuesCheck
|
|
@@ -16,10 +17,12 @@ from .instructions_check import InstructionsCheck
|
|
|
16
17
|
from .mcp_check import MCPCheck
|
|
17
18
|
from .mcp_services_check import MCPServicesCheck
|
|
18
19
|
from .monitor_check import MonitorCheck
|
|
20
|
+
from .skill_sources_check import SkillSourcesCheck
|
|
19
21
|
from .startup_log_check import StartupLogCheck
|
|
20
22
|
|
|
21
23
|
__all__ = [
|
|
22
24
|
"AgentCheck",
|
|
25
|
+
"AgentSourcesCheck",
|
|
23
26
|
"BaseDiagnosticCheck",
|
|
24
27
|
"ClaudeCodeCheck",
|
|
25
28
|
"CommonIssuesCheck",
|
|
@@ -30,5 +33,6 @@ __all__ = [
|
|
|
30
33
|
"MCPCheck",
|
|
31
34
|
"MCPServicesCheck",
|
|
32
35
|
"MonitorCheck",
|
|
36
|
+
"SkillSourcesCheck",
|
|
33
37
|
"StartupLogCheck",
|
|
34
38
|
]
|
|
@@ -66,9 +66,9 @@ class AgentCheck(BaseDiagnosticCheck):
|
|
|
66
66
|
|
|
67
67
|
if deployed_count == 0:
|
|
68
68
|
status = ValidationSeverity.ERROR
|
|
69
|
-
message = f"No agents deployed (0/{available_count}
|
|
69
|
+
message = f"No agents deployed (0/{available_count} cached)"
|
|
70
70
|
fix_command = "claude-mpm agents deploy"
|
|
71
|
-
fix_description = "Deploy all
|
|
71
|
+
fix_description = "Deploy all cached agents"
|
|
72
72
|
elif deployed_count < available_count:
|
|
73
73
|
status = ValidationSeverity.WARNING
|
|
74
74
|
message = f"{deployed_count}/{available_count} agents deployed"
|
|
@@ -188,7 +188,6 @@ class AgentCheck(BaseDiagnosticCheck):
|
|
|
188
188
|
def _check_agent_versions(self) -> DiagnosticResult:
|
|
189
189
|
"""Check if deployed agents are up-to-date."""
|
|
190
190
|
try:
|
|
191
|
-
|
|
192
191
|
from ....services.agents.deployment.agent_version_manager import (
|
|
193
192
|
AgentVersionManager,
|
|
194
193
|
)
|
|
@@ -258,7 +257,6 @@ class AgentCheck(BaseDiagnosticCheck):
|
|
|
258
257
|
def _validate_agents(self) -> DiagnosticResult:
|
|
259
258
|
"""Validate agent configurations."""
|
|
260
259
|
try:
|
|
261
|
-
|
|
262
260
|
from ....services.agents.deployment.agent_validator import AgentValidator
|
|
263
261
|
|
|
264
262
|
AgentValidator()
|