claude-mpm 5.4.22__py3-none-any.whl → 5.6.34__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/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
- claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +374 -1257
- claude_mpm/agents/WORKFLOW.md +6 -253
- claude_mpm/agents/agent_loader.py +1 -1
- claude_mpm/agents/base_agent.json +31 -0
- claude_mpm/agents/frontmatter_validator.py +2 -2
- claude_mpm/agents/templates/circuit-breakers.md +26 -17
- claude_mpm/cli/__init__.py +5 -1
- claude_mpm/cli/commands/agent_state_manager.py +10 -10
- claude_mpm/cli/commands/agents.py +11 -13
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/auto_configure.py +4 -4
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/configure.py +621 -22
- claude_mpm/cli/commands/configure_agent_display.py +12 -0
- claude_mpm/cli/commands/hook_errors.py +60 -60
- claude_mpm/cli/commands/monitor.py +2 -2
- claude_mpm/cli/commands/mpm_init/core.py +72 -0
- claude_mpm/cli/commands/postmortem.py +1 -1
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +182 -32
- claude_mpm/cli/executor.py +130 -16
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +32 -52
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/parsers/base_parser.py +83 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +10 -0
- claude_mpm/cli/parsers/skill_source_parser.py +4 -0
- claude_mpm/cli/parsers/skills_parser.py +2 -3
- claude_mpm/cli/startup.py +690 -386
- claude_mpm/cli/startup_display.py +74 -6
- claude_mpm/cli/startup_logging.py +2 -2
- claude_mpm/cli/utils.py +7 -3
- claude_mpm/commander/__init__.py +78 -0
- claude_mpm/commander/adapters/__init__.py +60 -0
- claude_mpm/commander/adapters/auggie.py +260 -0
- claude_mpm/commander/adapters/base.py +288 -0
- claude_mpm/commander/adapters/claude_code.py +392 -0
- claude_mpm/commander/adapters/codex.py +237 -0
- claude_mpm/commander/adapters/communication.py +366 -0
- claude_mpm/commander/adapters/example_usage.py +310 -0
- claude_mpm/commander/adapters/mpm.py +389 -0
- claude_mpm/commander/adapters/registry.py +204 -0
- claude_mpm/commander/api/__init__.py +16 -0
- claude_mpm/commander/api/app.py +121 -0
- claude_mpm/commander/api/errors.py +133 -0
- claude_mpm/commander/api/routes/__init__.py +8 -0
- claude_mpm/commander/api/routes/events.py +184 -0
- claude_mpm/commander/api/routes/inbox.py +171 -0
- claude_mpm/commander/api/routes/messages.py +148 -0
- claude_mpm/commander/api/routes/projects.py +271 -0
- claude_mpm/commander/api/routes/sessions.py +226 -0
- claude_mpm/commander/api/routes/work.py +296 -0
- claude_mpm/commander/api/schemas.py +186 -0
- claude_mpm/commander/chat/__init__.py +7 -0
- claude_mpm/commander/chat/cli.py +146 -0
- claude_mpm/commander/chat/commands.py +96 -0
- claude_mpm/commander/chat/repl.py +310 -0
- claude_mpm/commander/config.py +51 -0
- claude_mpm/commander/config_loader.py +115 -0
- claude_mpm/commander/core/__init__.py +10 -0
- claude_mpm/commander/core/block_manager.py +325 -0
- claude_mpm/commander/core/response_manager.py +323 -0
- claude_mpm/commander/daemon.py +603 -0
- claude_mpm/commander/env_loader.py +59 -0
- claude_mpm/commander/events/__init__.py +26 -0
- claude_mpm/commander/events/manager.py +332 -0
- claude_mpm/commander/frameworks/__init__.py +12 -0
- claude_mpm/commander/frameworks/base.py +146 -0
- claude_mpm/commander/frameworks/claude_code.py +58 -0
- claude_mpm/commander/frameworks/mpm.py +62 -0
- claude_mpm/commander/inbox/__init__.py +16 -0
- claude_mpm/commander/inbox/dedup.py +128 -0
- claude_mpm/commander/inbox/inbox.py +224 -0
- claude_mpm/commander/inbox/models.py +70 -0
- claude_mpm/commander/instance_manager.py +450 -0
- claude_mpm/commander/llm/__init__.py +6 -0
- claude_mpm/commander/llm/openrouter_client.py +167 -0
- claude_mpm/commander/llm/summarizer.py +70 -0
- claude_mpm/commander/memory/__init__.py +45 -0
- claude_mpm/commander/memory/compression.py +347 -0
- claude_mpm/commander/memory/embeddings.py +230 -0
- claude_mpm/commander/memory/entities.py +310 -0
- claude_mpm/commander/memory/example_usage.py +290 -0
- claude_mpm/commander/memory/integration.py +325 -0
- claude_mpm/commander/memory/search.py +381 -0
- claude_mpm/commander/memory/store.py +657 -0
- claude_mpm/commander/models/__init__.py +18 -0
- claude_mpm/commander/models/events.py +121 -0
- claude_mpm/commander/models/project.py +162 -0
- claude_mpm/commander/models/work.py +214 -0
- claude_mpm/commander/parsing/__init__.py +20 -0
- claude_mpm/commander/parsing/extractor.py +132 -0
- claude_mpm/commander/parsing/output_parser.py +270 -0
- claude_mpm/commander/parsing/patterns.py +100 -0
- claude_mpm/commander/persistence/__init__.py +11 -0
- claude_mpm/commander/persistence/event_store.py +274 -0
- claude_mpm/commander/persistence/state_store.py +309 -0
- claude_mpm/commander/persistence/work_store.py +164 -0
- claude_mpm/commander/polling/__init__.py +13 -0
- claude_mpm/commander/polling/event_detector.py +104 -0
- claude_mpm/commander/polling/output_buffer.py +49 -0
- claude_mpm/commander/polling/output_poller.py +153 -0
- claude_mpm/commander/project_session.py +268 -0
- claude_mpm/commander/proxy/__init__.py +12 -0
- claude_mpm/commander/proxy/formatter.py +89 -0
- claude_mpm/commander/proxy/output_handler.py +191 -0
- claude_mpm/commander/proxy/relay.py +155 -0
- claude_mpm/commander/registry.py +410 -0
- claude_mpm/commander/runtime/__init__.py +10 -0
- claude_mpm/commander/runtime/executor.py +191 -0
- claude_mpm/commander/runtime/monitor.py +346 -0
- claude_mpm/commander/session/__init__.py +6 -0
- claude_mpm/commander/session/context.py +81 -0
- claude_mpm/commander/session/manager.py +59 -0
- claude_mpm/commander/tmux_orchestrator.py +361 -0
- claude_mpm/commander/web/__init__.py +1 -0
- claude_mpm/commander/work/__init__.py +30 -0
- claude_mpm/commander/work/executor.py +207 -0
- claude_mpm/commander/work/queue.py +405 -0
- claude_mpm/commander/workflow/__init__.py +27 -0
- claude_mpm/commander/workflow/event_handler.py +241 -0
- claude_mpm/commander/workflow/notifier.py +146 -0
- claude_mpm/commands/mpm-config.md +20 -249
- claude_mpm/commands/mpm-doctor.md +16 -21
- claude_mpm/commands/mpm-help.md +12 -205
- claude_mpm/commands/mpm-init.md +88 -506
- claude_mpm/commands/mpm-monitor.md +22 -401
- claude_mpm/commands/mpm-organize.md +70 -442
- claude_mpm/commands/mpm-postmortem.md +13 -107
- claude_mpm/commands/mpm-session-resume.md +20 -363
- claude_mpm/commands/mpm-status.md +13 -69
- claude_mpm/commands/mpm-ticket-view.md +60 -495
- claude_mpm/commands/mpm-version.md +13 -107
- claude_mpm/commands/mpm.md +8 -0
- claude_mpm/config/agent_presets.py +8 -7
- claude_mpm/config/skill_sources.py +16 -0
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +154 -2
- claude_mpm/core/config.py +37 -26
- claude_mpm/core/config_constants.py +74 -9
- claude_mpm/core/constants.py +56 -12
- claude_mpm/core/framework/loaders/agent_loader.py +1 -1
- claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
- claude_mpm/core/hook_manager.py +51 -3
- claude_mpm/core/interactive_session.py +12 -11
- claude_mpm/core/logger.py +26 -9
- claude_mpm/core/logging_utils.py +39 -13
- claude_mpm/core/network_config.py +148 -0
- claude_mpm/core/oneshot_session.py +7 -6
- claude_mpm/core/optimized_startup.py +61 -0
- claude_mpm/core/output_style_manager.py +66 -18
- claude_mpm/core/shared/config_loader.py +3 -1
- claude_mpm/core/socketio_pool.py +47 -15
- claude_mpm/core/unified_agent_registry.py +1 -1
- claude_mpm/core/unified_config.py +54 -8
- claude_mpm/core/unified_paths.py +95 -90
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.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/BRcwIQNr.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.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/cli_enhancements.py +2 -1
- claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
- claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.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__/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/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +527 -136
- claude_mpm/hooks/claude_hooks/hook_handler.py +313 -99
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +206 -36
- claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
- claude_mpm/hooks/claude_hooks/response_tracking.py +43 -60
- claude_mpm/hooks/claude_hooks/services/__init__.py +21 -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__/container.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__/protocols.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 +67 -32
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
- claude_mpm/hooks/claude_hooks/services/container.py +310 -0
- claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +75 -77
- claude_mpm/hooks/kuzu_memory_hook.py +5 -5
- claude_mpm/hooks/session_resume_hook.py +89 -1
- claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
- claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
- claude_mpm/init.py +276 -0
- claude_mpm/models/git_repository.py +3 -3
- claude_mpm/scripts/claude-hook-handler.sh +46 -19
- claude_mpm/services/agents/agent_builder.py +3 -3
- claude_mpm/services/agents/agent_recommendation_service.py +8 -8
- claude_mpm/services/agents/agent_selection_service.py +2 -2
- claude_mpm/services/agents/cache_git_manager.py +7 -7
- claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
- claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -2
- claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +39 -19
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
- claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +169 -26
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +101 -75
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/git_source_manager.py +23 -4
- claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
- claude_mpm/services/agents/sources/git_source_sync_service.py +121 -10
- claude_mpm/services/agents/startup_sync.py +27 -4
- claude_mpm/services/cli/__init__.py +3 -0
- claude_mpm/services/cli/incremental_pause_manager.py +561 -0
- claude_mpm/services/cli/session_resume_helper.py +10 -2
- claude_mpm/services/command_deployment_service.py +44 -26
- claude_mpm/services/delegation_detector.py +175 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
- claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
- claude_mpm/services/diagnostics/models.py +14 -1
- claude_mpm/services/event_log.py +325 -0
- claude_mpm/services/git/git_operations_service.py +8 -8
- claude_mpm/services/hook_installer_service.py +77 -8
- claude_mpm/services/infrastructure/__init__.py +4 -0
- claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
- claude_mpm/services/monitor/daemon_manager.py +15 -4
- claude_mpm/services/monitor/management/lifecycle.py +15 -3
- claude_mpm/services/monitor/server.py +571 -11
- claude_mpm/services/pm_skills_deployer.py +884 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/skills/git_skill_source_manager.py +281 -20
- claude_mpm/services/skills/selective_skill_deployer.py +211 -46
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills_deployer.py +192 -70
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +37 -6
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/core.py +262 -123
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/skills/__init__.py +2 -1
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
- claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
- claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
- claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
- claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
- claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
- claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
- claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
- claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
- claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
- claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
- claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
- claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
- claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
- claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
- claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
- claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
- claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +112 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/registry.py +295 -90
- claude_mpm/skills/skill_manager.py +98 -3
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/utils/agent_dependency_loader.py +115 -4
- claude_mpm/utils/agent_filters.py +1 -1
- claude_mpm/utils/migration.py +4 -4
- claude_mpm/utils/robust_installer.py +86 -21
- claude_mpm-5.6.34.dist-info/METADATA +393 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/RECORD +486 -145
- claude_mpm-5.4.22.dist-info/METADATA +0 -996
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/top_level.txt +0 -0
claude_mpm/cli/commands/run.py
CHANGED
|
@@ -13,7 +13,7 @@ DESIGN DECISIONS:
|
|
|
13
13
|
- Support multiple output formats (json, yaml, table, text)
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
|
-
import subprocess
|
|
16
|
+
import subprocess # nosec B404 - required for process management
|
|
17
17
|
import sys
|
|
18
18
|
from datetime import datetime, timezone
|
|
19
19
|
from typing import Optional
|
|
@@ -489,6 +489,18 @@ class RunCommand(BaseCommand):
|
|
|
489
489
|
if hasattr(args, "claude_args") and args.claude_args:
|
|
490
490
|
claude_args.extend(args.claude_args)
|
|
491
491
|
|
|
492
|
+
# Add --resume if flag is set
|
|
493
|
+
if getattr(args, "resume", False) and "--resume" not in claude_args:
|
|
494
|
+
claude_args.insert(0, "--resume")
|
|
495
|
+
|
|
496
|
+
# Add --chrome if flag is set
|
|
497
|
+
if getattr(args, "chrome", False) and "--chrome" not in claude_args:
|
|
498
|
+
claude_args.insert(0, "--chrome")
|
|
499
|
+
|
|
500
|
+
# Add --no-chrome if flag is set
|
|
501
|
+
if getattr(args, "no_chrome", False) and "--no-chrome" not in claude_args:
|
|
502
|
+
claude_args.insert(0, "--no-chrome")
|
|
503
|
+
|
|
492
504
|
# Create runner
|
|
493
505
|
runner = ClaudeRunner(
|
|
494
506
|
enable_tickets=enable_tickets,
|
|
@@ -553,7 +565,7 @@ class RunCommand(BaseCommand):
|
|
|
553
565
|
wrapper_path = get_scripts_dir() / "interactive_wrapper.py"
|
|
554
566
|
if wrapper_path.exists():
|
|
555
567
|
print("Starting interactive session with command interception...")
|
|
556
|
-
subprocess.run([sys.executable, str(wrapper_path)], check=False)
|
|
568
|
+
subprocess.run([sys.executable, str(wrapper_path)], check=False) # nosec B603 - trusted internal paths
|
|
557
569
|
else:
|
|
558
570
|
self.logger.warning(
|
|
559
571
|
"Interactive wrapper not found, falling back to normal mode"
|
|
@@ -907,6 +919,26 @@ def run_session_legacy(args):
|
|
|
907
919
|
else:
|
|
908
920
|
logger.info("[INFO]️ --resume already in claude_args")
|
|
909
921
|
|
|
922
|
+
# Add --chrome to claude_args if the flag is set
|
|
923
|
+
chrome_flag_present = getattr(args, "chrome", False)
|
|
924
|
+
if chrome_flag_present:
|
|
925
|
+
logger.info("📌 --chrome flag detected in args")
|
|
926
|
+
if "--chrome" not in raw_claude_args:
|
|
927
|
+
raw_claude_args = ["--chrome", *raw_claude_args]
|
|
928
|
+
logger.info("✅ Added --chrome to claude_args")
|
|
929
|
+
else:
|
|
930
|
+
logger.info("ℹ️ --chrome already in claude_args")
|
|
931
|
+
|
|
932
|
+
# Add --no-chrome to claude_args if the flag is set
|
|
933
|
+
no_chrome_flag_present = getattr(args, "no_chrome", False)
|
|
934
|
+
if no_chrome_flag_present:
|
|
935
|
+
logger.info("📌 --no-chrome flag detected in args")
|
|
936
|
+
if "--no-chrome" not in raw_claude_args:
|
|
937
|
+
raw_claude_args = ["--no-chrome", *raw_claude_args]
|
|
938
|
+
logger.info("✅ Added --no-chrome to claude_args")
|
|
939
|
+
else:
|
|
940
|
+
logger.info("ℹ️ --no-chrome already in claude_args")
|
|
941
|
+
|
|
910
942
|
# Filter out claude-mpm specific flags before passing to Claude CLI
|
|
911
943
|
logger.debug(f"Pre-filter claude_args: {raw_claude_args}")
|
|
912
944
|
claude_args = filter_claude_mpm_args(raw_claude_args)
|
|
@@ -1044,7 +1076,7 @@ def run_session_legacy(args):
|
|
|
1044
1076
|
wrapper_path = get_scripts_dir() / "interactive_wrapper.py"
|
|
1045
1077
|
if wrapper_path.exists():
|
|
1046
1078
|
print("Starting interactive session with command interception...")
|
|
1047
|
-
subprocess.run([sys.executable, str(wrapper_path)], check=False)
|
|
1079
|
+
subprocess.run([sys.executable, str(wrapper_path)], check=False) # nosec B603 - trusted internal paths
|
|
1048
1080
|
else:
|
|
1049
1081
|
logger.warning("Interactive wrapper not found, falling back to normal mode")
|
|
1050
1082
|
runner.run_interactive(context)
|
|
@@ -11,6 +11,7 @@ for better UX. Handles errors gracefully with actionable messages.
|
|
|
11
11
|
|
|
12
12
|
import json
|
|
13
13
|
import logging
|
|
14
|
+
import os
|
|
14
15
|
import re
|
|
15
16
|
|
|
16
17
|
from ...config.skill_sources import SkillSource, SkillSourceConfiguration
|
|
@@ -20,6 +21,33 @@ from ...services.skills.skill_discovery_service import SkillDiscoveryService
|
|
|
20
21
|
logger = logging.getLogger(__name__)
|
|
21
22
|
|
|
22
23
|
|
|
24
|
+
def _get_github_token(source: SkillSource | None = None) -> str | None:
|
|
25
|
+
"""Get GitHub token with source-specific override support.
|
|
26
|
+
|
|
27
|
+
Priority: source.token > GITHUB_TOKEN > GH_TOKEN
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
source: Optional SkillSource to check for per-source token
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
GitHub token if found, None otherwise
|
|
34
|
+
|
|
35
|
+
Security Note:
|
|
36
|
+
Token is never logged or printed to avoid exposure.
|
|
37
|
+
"""
|
|
38
|
+
# Priority 1: Per-source token (env var reference or direct)
|
|
39
|
+
if source and source.token:
|
|
40
|
+
if source.token.startswith("$"):
|
|
41
|
+
# Env var reference: $VAR_NAME -> os.environ.get("VAR_NAME")
|
|
42
|
+
env_var_name = source.token[1:]
|
|
43
|
+
return os.environ.get(env_var_name)
|
|
44
|
+
# Direct token (not recommended but supported)
|
|
45
|
+
return source.token
|
|
46
|
+
|
|
47
|
+
# Priority 2-3: Global environment variables
|
|
48
|
+
return os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN")
|
|
49
|
+
|
|
50
|
+
|
|
23
51
|
def _test_skill_repository_access(source: SkillSource) -> dict:
|
|
24
52
|
"""Test if skill repository is accessible via GitHub API.
|
|
25
53
|
|
|
@@ -58,7 +86,13 @@ def _test_skill_repository_access(source: SkillSource) -> dict:
|
|
|
58
86
|
# Test GitHub API access
|
|
59
87
|
api_url = f"https://api.github.com/repos/{owner_repo}"
|
|
60
88
|
|
|
61
|
-
|
|
89
|
+
# Build headers with authentication if token available
|
|
90
|
+
headers = {"Accept": "application/vnd.github+json"}
|
|
91
|
+
token = _get_github_token(source)
|
|
92
|
+
if token:
|
|
93
|
+
headers["Authorization"] = f"token {token}"
|
|
94
|
+
|
|
95
|
+
response = requests.get(api_url, headers=headers, timeout=10)
|
|
62
96
|
|
|
63
97
|
if response.status_code == 200:
|
|
64
98
|
return {"accessible": True, "error": None}
|
|
@@ -68,9 +102,14 @@ def _test_skill_repository_access(source: SkillSource) -> dict:
|
|
|
68
102
|
"error": f"Repository not found: {owner_repo}",
|
|
69
103
|
}
|
|
70
104
|
if response.status_code == 403:
|
|
105
|
+
error_msg = "Access denied (private repository or rate limit)"
|
|
106
|
+
if not token:
|
|
107
|
+
error_msg += (
|
|
108
|
+
". Try setting GITHUB_TOKEN environment variable for private repos"
|
|
109
|
+
)
|
|
71
110
|
return {
|
|
72
111
|
"accessible": False,
|
|
73
|
-
"error":
|
|
112
|
+
"error": error_msg,
|
|
74
113
|
}
|
|
75
114
|
return {
|
|
76
115
|
"accessible": False,
|
|
@@ -263,6 +302,15 @@ def handle_add_skill_source(args) -> int:
|
|
|
263
302
|
|
|
264
303
|
# Create new source
|
|
265
304
|
enabled = not args.disabled
|
|
305
|
+
token = getattr(args, "token", None)
|
|
306
|
+
|
|
307
|
+
# Security warning for direct tokens
|
|
308
|
+
if token and not token.startswith("$"):
|
|
309
|
+
print("⚠️ Warning: Direct token values in config are not recommended")
|
|
310
|
+
print(" Consider using environment variable reference instead:")
|
|
311
|
+
print(" --token $MY_PRIVATE_TOKEN")
|
|
312
|
+
print()
|
|
313
|
+
|
|
266
314
|
source = SkillSource(
|
|
267
315
|
id=source_id,
|
|
268
316
|
type="git",
|
|
@@ -270,6 +318,7 @@ def handle_add_skill_source(args) -> int:
|
|
|
270
318
|
branch=args.branch,
|
|
271
319
|
priority=args.priority,
|
|
272
320
|
enabled=enabled,
|
|
321
|
+
token=token,
|
|
273
322
|
)
|
|
274
323
|
|
|
275
324
|
# Determine if we should test
|
|
@@ -18,7 +18,7 @@ ARCHITECTURE:
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
import os
|
|
21
|
-
import subprocess
|
|
21
|
+
import subprocess # nosec B404
|
|
22
22
|
from typing import Optional
|
|
23
23
|
|
|
24
24
|
from rich.console import Console
|
|
@@ -84,6 +84,7 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
84
84
|
SkillsCommands.INFO.value: self._show_skill_info,
|
|
85
85
|
SkillsCommands.CONFIG.value: self._manage_config,
|
|
86
86
|
SkillsCommands.CONFIGURE.value: self._configure_skills,
|
|
87
|
+
SkillsCommands.SELECT.value: self._select_skills_interactive,
|
|
87
88
|
# GitHub deployment commands
|
|
88
89
|
SkillsCommands.DEPLOY_FROM_GITHUB.value: self._deploy_from_github,
|
|
89
90
|
SkillsCommands.LIST_AVAILABLE.value: self._list_available_github_skills,
|
|
@@ -504,7 +505,7 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
504
505
|
# Open in editor
|
|
505
506
|
editor = os.environ.get("EDITOR", "nano")
|
|
506
507
|
try:
|
|
507
|
-
subprocess.run([editor, str(config_path)], check=True)
|
|
508
|
+
subprocess.run([editor, str(config_path)], check=True) # nosec B603
|
|
508
509
|
console.print(
|
|
509
510
|
f"\n[green]Configuration saved to {config_path}[/green]\n"
|
|
510
511
|
)
|
|
@@ -537,7 +538,7 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
537
538
|
toolchain = getattr(args, "toolchain", None)
|
|
538
539
|
categories = getattr(args, "categories", None)
|
|
539
540
|
force = getattr(args, "force", False)
|
|
540
|
-
|
|
541
|
+
deploy_all = getattr(args, "all", False)
|
|
541
542
|
|
|
542
543
|
if collection:
|
|
543
544
|
console.print(
|
|
@@ -548,23 +549,15 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
548
549
|
"\n[bold cyan]Deploying skills from default collection...[/bold cyan]\n"
|
|
549
550
|
)
|
|
550
551
|
|
|
551
|
-
#
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
"[yellow]No toolchain specified. Use --toolchain to filter by language,[/yellow]"
|
|
555
|
-
)
|
|
556
|
-
console.print(
|
|
557
|
-
"[yellow]or --all-skills to deploy all available skills (not just agent-referenced).[/yellow]\n"
|
|
558
|
-
)
|
|
559
|
-
|
|
560
|
-
# Selective deployment is enabled by default (deploy only agent-referenced skills)
|
|
561
|
-
# Use --all-skills to disable selective mode
|
|
552
|
+
# Use selective deployment unless --all flag is provided
|
|
553
|
+
# Selective mode deploys only agent-referenced skills
|
|
554
|
+
# --all mode deploys all available skills from the collection
|
|
562
555
|
result = self.skills_deployer.deploy_skills(
|
|
563
556
|
collection=collection,
|
|
564
557
|
toolchain=toolchain,
|
|
565
558
|
categories=categories,
|
|
566
559
|
force=force,
|
|
567
|
-
selective=not
|
|
560
|
+
selective=not deploy_all,
|
|
568
561
|
)
|
|
569
562
|
|
|
570
563
|
# Display results
|
|
@@ -577,11 +570,7 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
577
570
|
f"(out of {total_available} available)[/cyan]"
|
|
578
571
|
)
|
|
579
572
|
console.print(
|
|
580
|
-
"[dim]Use
|
|
581
|
-
)
|
|
582
|
-
else:
|
|
583
|
-
console.print(
|
|
584
|
-
"[cyan]📦 Deploying all available skills (selective mode disabled)[/cyan]\n"
|
|
573
|
+
"[dim]Use 'claude-mpm skills configure' to manually select skills[/dim]\n"
|
|
585
574
|
)
|
|
586
575
|
|
|
587
576
|
if result["deployed_count"] > 0:
|
|
@@ -606,6 +595,16 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
606
595
|
console.print(f" • {error}")
|
|
607
596
|
console.print()
|
|
608
597
|
|
|
598
|
+
# Show cleanup results
|
|
599
|
+
cleanup = result.get("cleanup", {})
|
|
600
|
+
if cleanup.get("removed_count", 0) > 0:
|
|
601
|
+
console.print(
|
|
602
|
+
f"[yellow]🧹 Removed {cleanup['removed_count']} orphaned skill(s):[/yellow]"
|
|
603
|
+
)
|
|
604
|
+
for skill in cleanup.get("removed_skills", []):
|
|
605
|
+
console.print(f" • {skill}")
|
|
606
|
+
console.print()
|
|
607
|
+
|
|
609
608
|
# Show restart instructions
|
|
610
609
|
if result["restart_instructions"]:
|
|
611
610
|
console.print(
|
|
@@ -677,33 +676,91 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
677
676
|
def _check_deployed_skills(self, args) -> CommandResult:
|
|
678
677
|
"""Check currently deployed skills in ~/.claude/skills/."""
|
|
679
678
|
try:
|
|
680
|
-
|
|
679
|
+
# Get deployed skills
|
|
680
|
+
deployed_result = self.skills_deployer.check_deployed_skills()
|
|
681
|
+
deployed_names = {skill["name"] for skill in deployed_result["skills"]}
|
|
681
682
|
|
|
682
683
|
console.print("\n[bold cyan]Claude Code Skills Status:[/bold cyan]\n")
|
|
683
|
-
console.print(
|
|
684
|
+
console.print(
|
|
685
|
+
f"[dim]Directory: {deployed_result['claude_skills_dir']}[/dim]\n"
|
|
686
|
+
)
|
|
687
|
+
|
|
688
|
+
# Fetch available skills from GitHub to get full list
|
|
689
|
+
try:
|
|
690
|
+
available_result = self.skills_deployer.list_available_skills()
|
|
691
|
+
all_skills = available_result.get("skills", [])
|
|
692
|
+
except Exception as e:
|
|
693
|
+
console.print(
|
|
694
|
+
f"[yellow]Warning: Could not fetch available skills: {e}[/yellow]\n"
|
|
695
|
+
)
|
|
696
|
+
all_skills = []
|
|
684
697
|
|
|
685
|
-
|
|
686
|
-
|
|
698
|
+
# Combine deployed and available skills
|
|
699
|
+
skill_map = {}
|
|
700
|
+
|
|
701
|
+
# Add available skills
|
|
702
|
+
for skill in all_skills:
|
|
703
|
+
skill_name = skill.get("name", "")
|
|
704
|
+
if skill_name:
|
|
705
|
+
skill_map[skill_name] = {
|
|
706
|
+
"name": skill.get("display_name")
|
|
707
|
+
or skill_name.replace("-", " ").title(),
|
|
708
|
+
"skill_id": skill_name,
|
|
709
|
+
"source": "MPM Skills",
|
|
710
|
+
"is_deployed": skill_name in deployed_names,
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
# Add any deployed skills not in available list (local/custom skills)
|
|
714
|
+
for skill in deployed_result["skills"]:
|
|
715
|
+
skill_name = skill["name"]
|
|
716
|
+
if skill_name not in skill_map:
|
|
717
|
+
skill_map[skill_name] = {
|
|
718
|
+
"name": skill_name.replace("-", " ").title(),
|
|
719
|
+
"skill_id": skill_name,
|
|
720
|
+
"source": "Local",
|
|
721
|
+
"is_deployed": True,
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
if not skill_map:
|
|
725
|
+
console.print("[yellow]No skills available.[/yellow]")
|
|
687
726
|
console.print(
|
|
688
727
|
"[dim]Use 'claude-mpm skills deploy-github' to deploy skills.[/dim]\n"
|
|
689
728
|
)
|
|
690
729
|
return CommandResult(success=True, exit_code=0)
|
|
691
730
|
|
|
692
|
-
|
|
693
|
-
|
|
731
|
+
# Create table matching agent management format
|
|
732
|
+
table = Table(show_header=True, header_style="bold cyan")
|
|
733
|
+
table.add_column("#", style="bright_black", width=6, no_wrap=True)
|
|
734
|
+
table.add_column(
|
|
735
|
+
"Skill ID", style="bright_black", no_wrap=True, overflow="ellipsis"
|
|
694
736
|
)
|
|
737
|
+
table.add_column(
|
|
738
|
+
"Name", style="bright_cyan", no_wrap=True, overflow="ellipsis"
|
|
739
|
+
)
|
|
740
|
+
table.add_column("Source", style="bright_yellow", no_wrap=True)
|
|
741
|
+
table.add_column("Status", style="bright_black", no_wrap=True)
|
|
695
742
|
|
|
696
|
-
#
|
|
697
|
-
|
|
698
|
-
table.add_column("Skill Name", style="green")
|
|
699
|
-
table.add_column("Path", style="dim")
|
|
743
|
+
# Sort skills by name for consistent display
|
|
744
|
+
sorted_skills = sorted(skill_map.values(), key=lambda s: s["skill_id"])
|
|
700
745
|
|
|
701
|
-
for skill in
|
|
702
|
-
|
|
746
|
+
for idx, skill in enumerate(sorted_skills, 1):
|
|
747
|
+
status = (
|
|
748
|
+
"[green]Installed[/green]" if skill["is_deployed"] else "Available"
|
|
749
|
+
)
|
|
750
|
+
table.add_row(
|
|
751
|
+
str(idx), skill["skill_id"], skill["name"], skill["source"], status
|
|
752
|
+
)
|
|
703
753
|
|
|
704
754
|
console.print(table)
|
|
705
755
|
console.print()
|
|
706
756
|
|
|
757
|
+
# Show summary
|
|
758
|
+
deployed_count = sum(1 for s in skill_map.values() if s["is_deployed"])
|
|
759
|
+
console.print(
|
|
760
|
+
f"[dim]Showing {len(skill_map)} skills ({deployed_count} installed, "
|
|
761
|
+
f"{len(skill_map) - deployed_count} available)[/dim]\n"
|
|
762
|
+
)
|
|
763
|
+
|
|
707
764
|
return CommandResult(success=True, exit_code=0)
|
|
708
765
|
|
|
709
766
|
except Exception as e:
|
|
@@ -1226,6 +1283,99 @@ class SkillsManagementCommand(BaseCommand):
|
|
|
1226
1283
|
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
1227
1284
|
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1228
1285
|
|
|
1286
|
+
def _select_skills_interactive(self, args) -> CommandResult:
|
|
1287
|
+
"""Interactive skill selection with topic grouping.
|
|
1288
|
+
|
|
1289
|
+
This command provides a two-tier selection interface:
|
|
1290
|
+
1. Select topic groups (toolchains) to explore
|
|
1291
|
+
2. Multi-select skills within each topic group
|
|
1292
|
+
|
|
1293
|
+
Features:
|
|
1294
|
+
- Groups skills by toolchain (universal, python, typescript, etc.)
|
|
1295
|
+
- Shows skills auto-included by agent dependencies
|
|
1296
|
+
- Displays token counts for each skill
|
|
1297
|
+
- Updates config and runs reconciliation
|
|
1298
|
+
|
|
1299
|
+
Returns:
|
|
1300
|
+
CommandResult with success/failure status
|
|
1301
|
+
"""
|
|
1302
|
+
try:
|
|
1303
|
+
from ...cli.interactive.skill_selector import run_skill_selector
|
|
1304
|
+
from ...core.unified_config import UnifiedConfig
|
|
1305
|
+
from ...services.agents.deployment.deployment_reconciler import (
|
|
1306
|
+
DeploymentReconciler,
|
|
1307
|
+
)
|
|
1308
|
+
|
|
1309
|
+
console.print("\n[bold cyan]Interactive Skill Selector[/bold cyan]\n")
|
|
1310
|
+
|
|
1311
|
+
# Run skill selector
|
|
1312
|
+
selected_skills = run_skill_selector()
|
|
1313
|
+
|
|
1314
|
+
if selected_skills is None:
|
|
1315
|
+
console.print("\n[yellow]Skill selection cancelled[/yellow]")
|
|
1316
|
+
return CommandResult(success=True, exit_code=0)
|
|
1317
|
+
|
|
1318
|
+
# Update config with selected skills
|
|
1319
|
+
config = UnifiedConfig()
|
|
1320
|
+
config.skills.enabled = selected_skills
|
|
1321
|
+
|
|
1322
|
+
# Save config
|
|
1323
|
+
try:
|
|
1324
|
+
config.save()
|
|
1325
|
+
console.print(
|
|
1326
|
+
f"\n[green]✓ Saved {len(selected_skills)} skills to configuration[/green]"
|
|
1327
|
+
)
|
|
1328
|
+
except Exception as e:
|
|
1329
|
+
console.print(f"\n[red]Failed to save configuration: {e}[/red]")
|
|
1330
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1331
|
+
|
|
1332
|
+
# Run reconciliation to deploy skills
|
|
1333
|
+
console.print("\n[cyan]Running skill reconciliation...[/cyan]")
|
|
1334
|
+
reconciler = DeploymentReconciler(config)
|
|
1335
|
+
|
|
1336
|
+
try:
|
|
1337
|
+
from pathlib import Path
|
|
1338
|
+
|
|
1339
|
+
project_path = Path.cwd()
|
|
1340
|
+
result = reconciler.reconcile_skills(project_path)
|
|
1341
|
+
|
|
1342
|
+
if result.deployed:
|
|
1343
|
+
console.print(
|
|
1344
|
+
f" [green]✓ Deployed: {', '.join(result.deployed)}[/green]"
|
|
1345
|
+
)
|
|
1346
|
+
if result.removed:
|
|
1347
|
+
console.print(
|
|
1348
|
+
f" [yellow]✓ Removed: {', '.join(result.removed)}[/yellow]"
|
|
1349
|
+
)
|
|
1350
|
+
if result.errors:
|
|
1351
|
+
for error in result.errors:
|
|
1352
|
+
console.print(f" [red]✗ {error}[/red]")
|
|
1353
|
+
|
|
1354
|
+
if result.success:
|
|
1355
|
+
console.print(
|
|
1356
|
+
"\n[bold green]✓ Skill deployment complete![/bold green]"
|
|
1357
|
+
)
|
|
1358
|
+
return CommandResult(success=True, exit_code=0)
|
|
1359
|
+
console.print(
|
|
1360
|
+
f"\n[yellow]⚠ Deployment had {len(result.errors)} errors[/yellow]"
|
|
1361
|
+
)
|
|
1362
|
+
return CommandResult(
|
|
1363
|
+
success=False,
|
|
1364
|
+
message=f"{len(result.errors)} deployment errors",
|
|
1365
|
+
exit_code=1,
|
|
1366
|
+
)
|
|
1367
|
+
|
|
1368
|
+
except Exception as e:
|
|
1369
|
+
console.print(f"\n[red]Reconciliation failed: {e}[/red]")
|
|
1370
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1371
|
+
|
|
1372
|
+
except Exception as e:
|
|
1373
|
+
console.print(f"[red]Skill selection error: {e}[/red]")
|
|
1374
|
+
import traceback
|
|
1375
|
+
|
|
1376
|
+
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
1377
|
+
return CommandResult(success=False, message=str(e), exit_code=1)
|
|
1378
|
+
|
|
1229
1379
|
|
|
1230
1380
|
def manage_skills(args) -> int:
|
|
1231
1381
|
"""
|
claude_mpm/cli/executor.py
CHANGED
|
@@ -66,6 +66,7 @@ def ensure_run_attributes(args):
|
|
|
66
66
|
args.monitor = getattr(args, "monitor", False)
|
|
67
67
|
args.force = getattr(args, "force", False)
|
|
68
68
|
args.reload_agents = getattr(args, "reload_agents", False)
|
|
69
|
+
args.force_sync = getattr(args, "force_sync", False)
|
|
69
70
|
# Include dependency checking attributes
|
|
70
71
|
args.check_dependencies = getattr(args, "check_dependencies", True)
|
|
71
72
|
args.force_check_dependencies = getattr(args, "force_check_dependencies", False)
|
|
@@ -126,6 +127,14 @@ def execute_command(command: str, args) -> int:
|
|
|
126
127
|
result = handle_verify(args)
|
|
127
128
|
return result if result is not None else 0
|
|
128
129
|
|
|
130
|
+
# Handle commander command with lazy import
|
|
131
|
+
if command == "commander":
|
|
132
|
+
# Lazy import to avoid loading unless needed
|
|
133
|
+
from .commands.commander import handle_commander_command
|
|
134
|
+
|
|
135
|
+
result = handle_commander_command(args)
|
|
136
|
+
return result if result is not None else 0
|
|
137
|
+
|
|
129
138
|
# Handle skill-source command with lazy import
|
|
130
139
|
if command == "skill-source":
|
|
131
140
|
# Lazy import to avoid loading unless needed
|
|
@@ -150,6 +159,16 @@ def execute_command(command: str, args) -> int:
|
|
|
150
159
|
result = summarize_command(args)
|
|
151
160
|
return result if result is not None else 0
|
|
152
161
|
|
|
162
|
+
# Handle profile command with lazy import
|
|
163
|
+
if command == "profile":
|
|
164
|
+
# Lazy import to avoid loading unless needed
|
|
165
|
+
from .commands.profile import ProfileCommand
|
|
166
|
+
|
|
167
|
+
cmd = ProfileCommand()
|
|
168
|
+
result = cmd.run(args)
|
|
169
|
+
# Convert CommandResult to exit code
|
|
170
|
+
return result.exit_code if result else 0
|
|
171
|
+
|
|
153
172
|
# Handle auto-configure command with lazy import
|
|
154
173
|
if command == "auto-configure":
|
|
155
174
|
# Lazy import to avoid loading unless needed
|
|
@@ -195,35 +214,127 @@ def execute_command(command: str, args) -> int:
|
|
|
195
214
|
"status": show_status,
|
|
196
215
|
}
|
|
197
216
|
|
|
198
|
-
# Get handler and
|
|
217
|
+
# Get handler and call it with argument list (same pattern as autotodos)
|
|
199
218
|
handler = handlers.get(subcommand)
|
|
200
219
|
if handler:
|
|
201
|
-
|
|
202
|
-
|
|
220
|
+
try:
|
|
221
|
+
# Build argument list for Click command based on subcommand
|
|
222
|
+
click_args = []
|
|
223
|
+
|
|
224
|
+
# list command: --format, --hook-type
|
|
225
|
+
if subcommand == "list":
|
|
226
|
+
if hasattr(args, "format") and args.format:
|
|
227
|
+
click_args.extend(["--format", args.format])
|
|
228
|
+
if hasattr(args, "hook_type") and args.hook_type:
|
|
229
|
+
click_args.extend(["--hook-type", args.hook_type])
|
|
230
|
+
# clear command: --hook-type, -y
|
|
231
|
+
elif subcommand == "clear":
|
|
232
|
+
if hasattr(args, "hook_type") and args.hook_type:
|
|
233
|
+
click_args.extend(["--hook-type", args.hook_type])
|
|
234
|
+
if hasattr(args, "yes") and args.yes:
|
|
235
|
+
click_args.append("-y")
|
|
236
|
+
# diagnose command: hook_type (positional argument)
|
|
237
|
+
elif subcommand == "diagnose":
|
|
238
|
+
if hasattr(args, "hook_type") and args.hook_type:
|
|
239
|
+
click_args.append(args.hook_type)
|
|
240
|
+
# status and summary commands: no options
|
|
241
|
+
|
|
242
|
+
# Call Click command with argument list and standalone_mode=False
|
|
243
|
+
handler(click_args, standalone_mode=False)
|
|
244
|
+
return 0
|
|
245
|
+
except SystemExit as e:
|
|
246
|
+
return e.code if e.code is not None else 0
|
|
247
|
+
except Exception as e:
|
|
248
|
+
print(f"Error: {e}")
|
|
249
|
+
return 1
|
|
250
|
+
else:
|
|
251
|
+
print(f"Unknown hook-errors subcommand: {subcommand}")
|
|
252
|
+
return 1
|
|
253
|
+
|
|
254
|
+
# Handle autotodos command with lazy import
|
|
255
|
+
if command == "autotodos":
|
|
256
|
+
# Lazy import to avoid loading unless needed
|
|
257
|
+
from .commands.autotodos import (
|
|
258
|
+
clear_autotodos,
|
|
259
|
+
inject_autotodos,
|
|
260
|
+
list_autotodos,
|
|
261
|
+
list_pm_violations,
|
|
262
|
+
scan_delegation_patterns,
|
|
263
|
+
show_autotodos_status,
|
|
264
|
+
)
|
|
203
265
|
|
|
204
|
-
|
|
266
|
+
# Get subcommand
|
|
267
|
+
subcommand = getattr(args, "autotodos_command", "status")
|
|
268
|
+
if not subcommand:
|
|
269
|
+
subcommand = "status"
|
|
205
270
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
271
|
+
# Map subcommands to functions
|
|
272
|
+
handlers = {
|
|
273
|
+
"list": list_autotodos,
|
|
274
|
+
"inject": inject_autotodos,
|
|
275
|
+
"clear": clear_autotodos,
|
|
276
|
+
"status": show_autotodos_status,
|
|
277
|
+
"scan": scan_delegation_patterns,
|
|
278
|
+
"violations": list_pm_violations,
|
|
279
|
+
}
|
|
214
280
|
|
|
281
|
+
# Get handler and call it with standalone_mode=False
|
|
282
|
+
handler = handlers.get(subcommand)
|
|
283
|
+
if handler:
|
|
215
284
|
try:
|
|
216
|
-
#
|
|
217
|
-
|
|
218
|
-
|
|
285
|
+
# Build argument list for Click command
|
|
286
|
+
click_args = []
|
|
287
|
+
|
|
288
|
+
if subcommand == "list":
|
|
289
|
+
fmt = getattr(args, "format", "table")
|
|
290
|
+
click_args = ["--format", fmt]
|
|
291
|
+
elif subcommand == "inject":
|
|
292
|
+
output = getattr(args, "output", None)
|
|
293
|
+
if output:
|
|
294
|
+
click_args = ["--output", output]
|
|
295
|
+
elif subcommand == "clear":
|
|
296
|
+
error_key = getattr(args, "error_key", None)
|
|
297
|
+
event_type = getattr(args, "event_type", "all")
|
|
298
|
+
if error_key:
|
|
299
|
+
click_args.append("--error-key")
|
|
300
|
+
click_args.append(error_key)
|
|
301
|
+
if event_type != "all":
|
|
302
|
+
click_args.append("--event-type")
|
|
303
|
+
click_args.append(event_type)
|
|
304
|
+
if getattr(args, "yes", False):
|
|
305
|
+
click_args.append("-y")
|
|
306
|
+
elif subcommand == "scan":
|
|
307
|
+
text = getattr(args, "text", None)
|
|
308
|
+
file = getattr(args, "file", None)
|
|
309
|
+
fmt = getattr(args, "format", "table")
|
|
310
|
+
save = getattr(args, "save", False)
|
|
311
|
+
|
|
312
|
+
if text:
|
|
313
|
+
click_args.append(text)
|
|
314
|
+
if file:
|
|
315
|
+
click_args.extend(["--file", file])
|
|
316
|
+
if fmt != "table":
|
|
317
|
+
click_args.extend(["--format", fmt])
|
|
318
|
+
if save:
|
|
319
|
+
click_args.append("--save")
|
|
320
|
+
elif subcommand == "violations":
|
|
321
|
+
fmt = getattr(args, "format", "table")
|
|
322
|
+
if fmt != "table":
|
|
323
|
+
click_args.extend(["--format", fmt])
|
|
324
|
+
|
|
325
|
+
# Call Click command with argument list and standalone_mode=False
|
|
326
|
+
handler(click_args, standalone_mode=False)
|
|
219
327
|
return 0
|
|
220
328
|
except SystemExit as e:
|
|
221
329
|
return e.code if e.code is not None else 0
|
|
222
330
|
except Exception as e:
|
|
223
331
|
print(f"Error: {e}")
|
|
332
|
+
import traceback
|
|
333
|
+
|
|
334
|
+
traceback.print_exc()
|
|
224
335
|
return 1
|
|
225
336
|
else:
|
|
226
|
-
print(f"Unknown
|
|
337
|
+
print(f"Unknown autotodos subcommand: {subcommand}")
|
|
227
338
|
return 1
|
|
228
339
|
|
|
229
340
|
# Map stable commands to their implementations
|
|
@@ -249,6 +360,7 @@ def execute_command(command: str, args) -> int:
|
|
|
249
360
|
CLICommands.SKILLS.value: manage_skills,
|
|
250
361
|
"debug": manage_debug, # Add debug command
|
|
251
362
|
"mpm-init": None, # Will be handled separately with lazy import
|
|
363
|
+
"commander": None, # Will be handled separately with lazy import
|
|
252
364
|
}
|
|
253
365
|
|
|
254
366
|
# Execute command if found
|
|
@@ -276,6 +388,8 @@ def execute_command(command: str, args) -> int:
|
|
|
276
388
|
"local-deploy",
|
|
277
389
|
"skill-source",
|
|
278
390
|
"agent-source",
|
|
391
|
+
"hook-errors",
|
|
392
|
+
"autotodos",
|
|
279
393
|
]
|
|
280
394
|
|
|
281
395
|
suggestion = suggest_similar_commands(command, all_commands)
|