claude-mpm 5.4.48__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/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/PM_INSTRUCTIONS.md +119 -689
- claude_mpm/agents/WORKFLOW.md +2 -0
- claude_mpm/agents/templates/circuit-breakers.md +26 -17
- claude_mpm/cli/__init__.py +5 -1
- claude_mpm/cli/commands/agents.py +2 -4
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/configure.py +620 -21
- claude_mpm/cli/commands/configure_agent_display.py +3 -1
- 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 +15 -8
- claude_mpm/cli/commands/profile.py +9 -10
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +171 -17
- claude_mpm/cli/executor.py +120 -16
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +30 -50
- 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 +76 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/profile_parser.py +0 -1
- 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 +5 -0
- claude_mpm/cli/startup.py +544 -511
- 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 +8 -0
- claude_mpm/commands/mpm-doctor.md +8 -0
- claude_mpm/commands/mpm-help.md +8 -0
- claude_mpm/commands/mpm-init.md +8 -0
- claude_mpm/commands/mpm-monitor.md +8 -0
- claude_mpm/commands/mpm-organize.md +8 -0
- claude_mpm/commands/mpm-postmortem.md +8 -0
- claude_mpm/commands/mpm-session-resume.md +9 -1
- claude_mpm/commands/mpm-status.md +8 -0
- claude_mpm/commands/mpm-ticket-view.md +8 -0
- claude_mpm/commands/mpm-version.md +8 -0
- 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 +35 -22
- claude_mpm/core/config_constants.py +74 -9
- claude_mpm/core/constants.py +56 -12
- 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 +3 -1
- 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_config.py +54 -8
- claude_mpm/core/unified_paths.py +95 -90
- 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/{uj46x2Wr.js → BSNlmTZj.js} +1 -1
- 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/{N4qtv3Hx.js → DR8nis88.js} +2 -2
- 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/{DjhvlsAc.js → NqQ1dWOy.js} +1 -1
- 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.CAGBuiOw.js → 0.RgBboRvH.js} +1 -1
- 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 -1
- claude_mpm/dashboard/static/svelte-build/index.html +11 -11
- 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__/auto_pause_handler.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/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +527 -136
- claude_mpm/hooks/claude_hooks/hook_handler.py +170 -104
- 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__/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 +41 -26
- 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/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 +215 -2
- claude_mpm/scripts/claude-hook-handler.sh +46 -19
- claude_mpm/scripts/start_activity_logging.py +0 -0
- 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 +1 -1
- claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +8 -6
- claude_mpm/services/agents/deployment/agent_template_builder.py +14 -4
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +4 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +4 -1
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/git_source_manager.py +6 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
- claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
- claude_mpm/services/agents/sources/git_source_sync_service.py +10 -5
- claude_mpm/services/agents/startup_sync.py +5 -2
- 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_sources_check.py +30 -0
- 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/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 +8 -3
- claude_mpm/services/monitor/server.py +106 -16
- claude_mpm/services/pm_skills_deployer.py +267 -94
- claude_mpm/services/profile_manager.py +10 -4
- claude_mpm/services/skills/git_skill_source_manager.py +192 -29
- 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 +188 -67
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- 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 +29 -23
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/utils/agent_dependency_loader.py +103 -4
- claude_mpm/utils/robust_installer.py +45 -24
- claude_mpm-5.6.34.dist-info/METADATA +393 -0
- {claude_mpm-5.4.48.dist-info → claude_mpm-5.6.34.dist-info}/RECORD +453 -151
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +0 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +0 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +0 -10
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm-5.4.48.dist-info/METADATA +0 -999
- {claude_mpm-5.4.48.dist-info → claude_mpm-5.6.34.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.48.dist-info → claude_mpm-5.6.34.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.48.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.48.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.48.dist-info → claude_mpm-5.6.34.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""Shared questionary styles for consistent TUI across Claude MPM.
|
|
2
|
+
|
|
3
|
+
This module provides unified styling for all interactive questionary interfaces
|
|
4
|
+
to ensure visual consistency across agent wizard, skill selector, and other TUI components.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from questionary import Style
|
|
8
|
+
|
|
9
|
+
# Standard cyan-themed style for all selectors
|
|
10
|
+
# Matches the pattern used in agent_wizard.py and skill_selector.py
|
|
11
|
+
MPM_STYLE = Style(
|
|
12
|
+
[
|
|
13
|
+
("qmark", "fg:cyan bold"),
|
|
14
|
+
("question", "bold"),
|
|
15
|
+
("answer", "fg:cyan"),
|
|
16
|
+
("pointer", "fg:cyan bold"),
|
|
17
|
+
("highlighted", "fg:cyan bold"),
|
|
18
|
+
("selected", "fg:cyan"),
|
|
19
|
+
]
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# Banner constants for consistent formatting
|
|
23
|
+
BANNER_WIDTH = 60
|
|
24
|
+
BANNER_CHAR = "="
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def print_banner(title: str, width: int = BANNER_WIDTH) -> None:
|
|
28
|
+
"""Print a styled banner matching agent selector format.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
title: Title text to display in the banner
|
|
32
|
+
width: Total width of the banner in characters (default: 60)
|
|
33
|
+
|
|
34
|
+
Example:
|
|
35
|
+
>>> print_banner("Agent Creation Wizard")
|
|
36
|
+
============================================================
|
|
37
|
+
Agent Creation Wizard
|
|
38
|
+
============================================================
|
|
39
|
+
"""
|
|
40
|
+
print()
|
|
41
|
+
print(BANNER_CHAR * width)
|
|
42
|
+
print(f"{title:^{width}}")
|
|
43
|
+
print(BANNER_CHAR * width)
|
|
44
|
+
print()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def print_section_header(emoji: str, title: str, width: int = BANNER_WIDTH) -> None:
|
|
48
|
+
"""Print a section header with emoji and title.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
emoji: Emoji to display before the title
|
|
52
|
+
title: Section title text
|
|
53
|
+
width: Total width of the header line (default: 60)
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
>>> print_section_header("🔧", "Agent Management Menu")
|
|
57
|
+
|
|
58
|
+
============================================================
|
|
59
|
+
🔧 Agent Management Menu
|
|
60
|
+
============================================================
|
|
61
|
+
"""
|
|
62
|
+
print()
|
|
63
|
+
print(BANNER_CHAR * width)
|
|
64
|
+
print(f"{emoji} {title}")
|
|
65
|
+
print(BANNER_CHAR * width)
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
"""Interactive Skill Selector for Claude MPM.
|
|
2
|
+
|
|
3
|
+
This module provides a two-tier interactive skill selection wizard:
|
|
4
|
+
1. Select topic groups (toolchains) to explore
|
|
5
|
+
2. Multi-select skills within each topic group
|
|
6
|
+
|
|
7
|
+
Features:
|
|
8
|
+
- Groups skills by toolchain (universal, python, typescript, etc.)
|
|
9
|
+
- Shows skills auto-included by agent dependencies
|
|
10
|
+
- Displays token counts for each skill
|
|
11
|
+
- Uses questionary with cyan style for consistency
|
|
12
|
+
- Matches agent selector UI pattern with table display
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import shutil
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from typing import Dict, List, Optional, Set
|
|
19
|
+
|
|
20
|
+
import questionary
|
|
21
|
+
|
|
22
|
+
from claude_mpm.cli.interactive.questionary_styles import (
|
|
23
|
+
BANNER_WIDTH,
|
|
24
|
+
MPM_STYLE,
|
|
25
|
+
print_banner,
|
|
26
|
+
)
|
|
27
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
28
|
+
from claude_mpm.core.unified_config import UnifiedConfig
|
|
29
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
30
|
+
|
|
31
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
# Topic/toolchain icons
|
|
34
|
+
TOPIC_ICONS = {
|
|
35
|
+
"universal": "🌐",
|
|
36
|
+
"python": "🐍",
|
|
37
|
+
"typescript": "📘",
|
|
38
|
+
"javascript": "📒",
|
|
39
|
+
"rust": "⚙️",
|
|
40
|
+
"go": "🔷",
|
|
41
|
+
"java": "☕",
|
|
42
|
+
"ruby": "💎",
|
|
43
|
+
"php": "🐘",
|
|
44
|
+
"csharp": "🔷",
|
|
45
|
+
"cpp": "⚙️",
|
|
46
|
+
"swift": "🍎",
|
|
47
|
+
None: "🌐", # Default for null toolchain (universal)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class SkillInfo:
|
|
53
|
+
"""Information about a skill from manifest."""
|
|
54
|
+
|
|
55
|
+
name: str
|
|
56
|
+
toolchain: Optional[str]
|
|
57
|
+
framework: Optional[str]
|
|
58
|
+
tags: List[str]
|
|
59
|
+
full_tokens: int
|
|
60
|
+
description: str = ""
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def display_name(self) -> str:
|
|
64
|
+
"""Get display name with token count."""
|
|
65
|
+
tokens_k = self.full_tokens // 1000
|
|
66
|
+
return f"{self.name} ({tokens_k}K tokens)"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class SkillSelector:
|
|
70
|
+
"""Interactive skill selector with topic grouping."""
|
|
71
|
+
|
|
72
|
+
def __init__(
|
|
73
|
+
self,
|
|
74
|
+
skills_manifest: Dict,
|
|
75
|
+
agent_skill_deps: Optional[List[str]] = None,
|
|
76
|
+
deployed_skills: Optional[Set[str]] = None,
|
|
77
|
+
):
|
|
78
|
+
"""Initialize skill selector.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
skills_manifest: Full manifest dict with all skills
|
|
82
|
+
agent_skill_deps: Skills required by deployed agents (auto-included)
|
|
83
|
+
deployed_skills: Skills currently deployed in .claude/skills/
|
|
84
|
+
"""
|
|
85
|
+
self.manifest = skills_manifest
|
|
86
|
+
self.agent_skill_deps = set(agent_skill_deps or [])
|
|
87
|
+
self.deployed_skills = deployed_skills or set()
|
|
88
|
+
self.skills_by_toolchain: Dict[str, List[SkillInfo]] = {}
|
|
89
|
+
self._parse_manifest()
|
|
90
|
+
|
|
91
|
+
def _parse_manifest(self) -> None:
|
|
92
|
+
"""Parse manifest and group skills by toolchain."""
|
|
93
|
+
# Handle both old and new manifest formats
|
|
94
|
+
skills_data = self.manifest.get("skills", {})
|
|
95
|
+
|
|
96
|
+
# Flatten skills from grouped format to flat list
|
|
97
|
+
all_skills = []
|
|
98
|
+
if isinstance(skills_data, dict):
|
|
99
|
+
for toolchain, skills_list in skills_data.items():
|
|
100
|
+
all_skills.extend(skills_list)
|
|
101
|
+
elif isinstance(skills_data, list):
|
|
102
|
+
all_skills = skills_data
|
|
103
|
+
|
|
104
|
+
# Group by toolchain
|
|
105
|
+
for skill_data in all_skills:
|
|
106
|
+
try:
|
|
107
|
+
skill = SkillInfo(
|
|
108
|
+
name=skill_data.get("name", ""),
|
|
109
|
+
toolchain=skill_data.get("toolchain"),
|
|
110
|
+
framework=skill_data.get("framework"),
|
|
111
|
+
tags=skill_data.get("tags", []),
|
|
112
|
+
full_tokens=skill_data.get("full_tokens", 0),
|
|
113
|
+
description=skill_data.get("description", ""),
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Group by toolchain (null -> universal)
|
|
117
|
+
toolchain_key = skill.toolchain or "universal"
|
|
118
|
+
|
|
119
|
+
if toolchain_key not in self.skills_by_toolchain:
|
|
120
|
+
self.skills_by_toolchain[toolchain_key] = []
|
|
121
|
+
|
|
122
|
+
self.skills_by_toolchain[toolchain_key].append(skill)
|
|
123
|
+
except Exception as e:
|
|
124
|
+
logger.warning(
|
|
125
|
+
f"Failed to parse skill: {skill_data.get('name', 'unknown')}: {e}"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Sort skills within each toolchain by name
|
|
129
|
+
for toolchain in self.skills_by_toolchain:
|
|
130
|
+
self.skills_by_toolchain[toolchain].sort(key=lambda s: s.name)
|
|
131
|
+
|
|
132
|
+
@staticmethod
|
|
133
|
+
def _calculate_column_widths(
|
|
134
|
+
terminal_width: int, columns: Dict[str, int]
|
|
135
|
+
) -> Dict[str, int]:
|
|
136
|
+
"""Calculate dynamic column widths based on terminal size.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
terminal_width: Current terminal width in characters
|
|
140
|
+
columns: Dict mapping column names to minimum widths
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
Dict mapping column names to calculated widths
|
|
144
|
+
|
|
145
|
+
Design:
|
|
146
|
+
- Ensures minimum widths are respected
|
|
147
|
+
- Distributes extra space proportionally
|
|
148
|
+
- Handles narrow terminals gracefully (minimum 80 chars)
|
|
149
|
+
"""
|
|
150
|
+
# Ensure minimum terminal width
|
|
151
|
+
min_terminal_width = 80
|
|
152
|
+
terminal_width = max(terminal_width, min_terminal_width)
|
|
153
|
+
|
|
154
|
+
# Calculate total minimum width needed
|
|
155
|
+
total_min_width = sum(columns.values())
|
|
156
|
+
|
|
157
|
+
# Account for spacing between columns
|
|
158
|
+
overhead = len(columns) + 1
|
|
159
|
+
available_width = terminal_width - overhead
|
|
160
|
+
|
|
161
|
+
# If we have extra space, distribute proportionally
|
|
162
|
+
if available_width > total_min_width:
|
|
163
|
+
extra_space = available_width - total_min_width
|
|
164
|
+
total_weight = sum(columns.values())
|
|
165
|
+
|
|
166
|
+
result = {}
|
|
167
|
+
for col_name, min_width in columns.items():
|
|
168
|
+
# Distribute extra space based on minimum width proportion
|
|
169
|
+
proportion = min_width / total_weight
|
|
170
|
+
extra = int(extra_space * proportion)
|
|
171
|
+
result[col_name] = min_width + extra
|
|
172
|
+
return result
|
|
173
|
+
# Terminal too narrow, use minimum widths
|
|
174
|
+
return columns.copy()
|
|
175
|
+
|
|
176
|
+
def _display_skills_table(self, skills: List[SkillInfo]) -> None:
|
|
177
|
+
"""Display skills in a table with status (matches agent selector pattern).
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
skills: List of skills to display
|
|
181
|
+
"""
|
|
182
|
+
if not skills:
|
|
183
|
+
print("\n📭 No skills found.")
|
|
184
|
+
return
|
|
185
|
+
|
|
186
|
+
# Calculate dynamic column widths based on terminal size
|
|
187
|
+
terminal_width = shutil.get_terminal_size().columns
|
|
188
|
+
min_widths = {
|
|
189
|
+
"#": 4,
|
|
190
|
+
"Skill ID": 30,
|
|
191
|
+
"Description": 35,
|
|
192
|
+
"Toolchain": 12,
|
|
193
|
+
"Status": 12,
|
|
194
|
+
}
|
|
195
|
+
widths = self._calculate_column_widths(terminal_width, min_widths)
|
|
196
|
+
|
|
197
|
+
# Print header with dynamic widths
|
|
198
|
+
print(
|
|
199
|
+
f"\n{'#':<{widths['#']}} "
|
|
200
|
+
f"{'Skill ID':<{widths['Skill ID']}} "
|
|
201
|
+
f"{'Description':<{widths['Description']}} "
|
|
202
|
+
f"{'Toolchain':<{widths['Toolchain']}} "
|
|
203
|
+
f"{'Status':<{widths['Status']}}"
|
|
204
|
+
)
|
|
205
|
+
separator_width = sum(widths.values()) + len(widths) - 1
|
|
206
|
+
print("-" * separator_width)
|
|
207
|
+
|
|
208
|
+
for i, skill in enumerate(skills, 1):
|
|
209
|
+
# Truncate to fit dynamic width
|
|
210
|
+
skill_id = skill.name
|
|
211
|
+
if len(skill_id) > widths["Skill ID"]:
|
|
212
|
+
skill_id = skill_id[: widths["Skill ID"] - 1] + "…"
|
|
213
|
+
|
|
214
|
+
description = skill.description or skill.name
|
|
215
|
+
if len(description) > widths["Description"]:
|
|
216
|
+
description = description[: widths["Description"] - 1] + "…"
|
|
217
|
+
|
|
218
|
+
toolchain = skill.toolchain or "universal"
|
|
219
|
+
if len(toolchain) > widths["Toolchain"]:
|
|
220
|
+
toolchain = toolchain[: widths["Toolchain"] - 1] + "…"
|
|
221
|
+
|
|
222
|
+
# Determine status
|
|
223
|
+
if skill.name in self.agent_skill_deps:
|
|
224
|
+
status = "✓ Required"
|
|
225
|
+
elif skill.name in self.deployed_skills:
|
|
226
|
+
status = "✓ Installed"
|
|
227
|
+
else:
|
|
228
|
+
status = "Available"
|
|
229
|
+
|
|
230
|
+
print(
|
|
231
|
+
f"{i:<{widths['#']}} "
|
|
232
|
+
f"{skill_id:<{widths['Skill ID']}} "
|
|
233
|
+
f"{description:<{widths['Description']}} "
|
|
234
|
+
f"{toolchain:<{widths['Toolchain']}} "
|
|
235
|
+
f"{status:<{widths['Status']}}"
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
def select_skills(self) -> List[str]:
|
|
239
|
+
"""Run interactive selection and return selected skill IDs.
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
List of selected skill IDs (names)
|
|
243
|
+
"""
|
|
244
|
+
print_banner("SKILL CONFIGURATION", width=BANNER_WIDTH)
|
|
245
|
+
|
|
246
|
+
# Show agent-required skills (auto-included)
|
|
247
|
+
if self.agent_skill_deps:
|
|
248
|
+
self._show_agent_required_skills()
|
|
249
|
+
|
|
250
|
+
# Get all skills for table display
|
|
251
|
+
all_skills = []
|
|
252
|
+
for toolchain_skills in self.skills_by_toolchain.values():
|
|
253
|
+
all_skills.extend(toolchain_skills)
|
|
254
|
+
all_skills.sort(key=lambda s: s.name)
|
|
255
|
+
|
|
256
|
+
# Display skills table
|
|
257
|
+
print(f"\n📋 Found {len(all_skills)} skill(s) available:")
|
|
258
|
+
self._display_skills_table(all_skills)
|
|
259
|
+
|
|
260
|
+
# Select topic groups to explore
|
|
261
|
+
selected_groups = self._select_topic_groups()
|
|
262
|
+
|
|
263
|
+
if not selected_groups:
|
|
264
|
+
print("\n⚠️ No topic groups selected. Using only agent-required skills.")
|
|
265
|
+
return list(self.agent_skill_deps)
|
|
266
|
+
|
|
267
|
+
# Multi-select skills from each group
|
|
268
|
+
selected_skills = set(self.agent_skill_deps) # Start with auto-included
|
|
269
|
+
|
|
270
|
+
for group in selected_groups:
|
|
271
|
+
group_skills = self._select_skills_from_group(group)
|
|
272
|
+
selected_skills.update(group_skills)
|
|
273
|
+
|
|
274
|
+
# Confirm selection
|
|
275
|
+
print(f"\n✅ Total skills selected: {len(selected_skills)}")
|
|
276
|
+
print(f" - Auto-included (from agents): {len(self.agent_skill_deps)}")
|
|
277
|
+
print(f" - Manually selected: {len(selected_skills - self.agent_skill_deps)}")
|
|
278
|
+
|
|
279
|
+
return list(selected_skills)
|
|
280
|
+
|
|
281
|
+
def _show_agent_required_skills(self) -> None:
|
|
282
|
+
"""Display skills that are auto-included from agent dependencies."""
|
|
283
|
+
print("\n📦 Agent-Required Skills (auto-included):")
|
|
284
|
+
for skill_name in sorted(self.agent_skill_deps):
|
|
285
|
+
print(f" ✓ {skill_name}")
|
|
286
|
+
print()
|
|
287
|
+
|
|
288
|
+
def _select_topic_groups(self) -> List[str]:
|
|
289
|
+
"""First tier: Select which toolchain groups to browse.
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
List of selected toolchain keys
|
|
293
|
+
"""
|
|
294
|
+
# Build choices with counts
|
|
295
|
+
choices = []
|
|
296
|
+
for toolchain in sorted(self.skills_by_toolchain.keys()):
|
|
297
|
+
skills = self.skills_by_toolchain[toolchain]
|
|
298
|
+
icon = TOPIC_ICONS.get(toolchain, "📦")
|
|
299
|
+
display_name = toolchain.capitalize() if toolchain else "Universal"
|
|
300
|
+
choice_text = f"{icon} {display_name} ({len(skills)} skills)"
|
|
301
|
+
choices.append(questionary.Choice(title=choice_text, value=toolchain))
|
|
302
|
+
|
|
303
|
+
if not choices:
|
|
304
|
+
print("\n⚠️ No skills available in manifest.")
|
|
305
|
+
return []
|
|
306
|
+
|
|
307
|
+
# Multi-select groups
|
|
308
|
+
selected = questionary.checkbox(
|
|
309
|
+
"📂 Select Topic Groups to Add Skills From:",
|
|
310
|
+
choices=choices,
|
|
311
|
+
style=MPM_STYLE,
|
|
312
|
+
).ask()
|
|
313
|
+
|
|
314
|
+
if selected is None: # User cancelled
|
|
315
|
+
return []
|
|
316
|
+
|
|
317
|
+
return selected
|
|
318
|
+
|
|
319
|
+
def _select_skills_from_group(self, toolchain: str) -> List[str]:
|
|
320
|
+
"""Second tier: Multi-select skills within a toolchain group.
|
|
321
|
+
|
|
322
|
+
Args:
|
|
323
|
+
toolchain: Toolchain key to select from
|
|
324
|
+
|
|
325
|
+
Returns:
|
|
326
|
+
List of selected skill names
|
|
327
|
+
"""
|
|
328
|
+
skills = self.skills_by_toolchain.get(toolchain, [])
|
|
329
|
+
if not skills:
|
|
330
|
+
return []
|
|
331
|
+
|
|
332
|
+
icon = TOPIC_ICONS.get(toolchain, "📦")
|
|
333
|
+
display_name = toolchain.capitalize() if toolchain else "Universal"
|
|
334
|
+
|
|
335
|
+
print(f"\n{icon} {display_name} Skills:")
|
|
336
|
+
|
|
337
|
+
# Build choices with numbered format like agent selector
|
|
338
|
+
choices = []
|
|
339
|
+
for i, skill in enumerate(skills, 1):
|
|
340
|
+
# Mark if already selected (from agent deps)
|
|
341
|
+
already_selected = skill.name in self.agent_skill_deps
|
|
342
|
+
|
|
343
|
+
# Format: "1. skill-name - toolchain (XK tokens)"
|
|
344
|
+
tokens_k = skill.full_tokens // 1000
|
|
345
|
+
desc = skill.description[:50] if skill.description else skill.name
|
|
346
|
+
choice_text = f"{i}. {skill.name} - {desc}... ({tokens_k}K tokens)"
|
|
347
|
+
|
|
348
|
+
choice = questionary.Choice(
|
|
349
|
+
title=choice_text,
|
|
350
|
+
value=skill.name,
|
|
351
|
+
checked=already_selected,
|
|
352
|
+
)
|
|
353
|
+
choices.append(choice)
|
|
354
|
+
|
|
355
|
+
# Multi-select skills
|
|
356
|
+
selected = questionary.checkbox(
|
|
357
|
+
f"Select {display_name} skills to include:",
|
|
358
|
+
choices=choices,
|
|
359
|
+
style=MPM_STYLE,
|
|
360
|
+
).ask()
|
|
361
|
+
|
|
362
|
+
if selected is None: # User cancelled
|
|
363
|
+
return []
|
|
364
|
+
|
|
365
|
+
return selected
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def load_skills_manifest() -> Optional[Dict]:
|
|
369
|
+
"""Load skills manifest from cache.
|
|
370
|
+
|
|
371
|
+
Returns:
|
|
372
|
+
Manifest dict or None if not found
|
|
373
|
+
"""
|
|
374
|
+
try:
|
|
375
|
+
path_manager = get_path_manager()
|
|
376
|
+
manifest_path = (
|
|
377
|
+
path_manager.get_cache_dir() / "skills" / "system" / "manifest.json"
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
if not manifest_path.exists():
|
|
381
|
+
logger.error(f"Skills manifest not found at {manifest_path}")
|
|
382
|
+
print("\n❌ Skills manifest not found. Run 'claude-mpm skills sync' first.")
|
|
383
|
+
return None
|
|
384
|
+
|
|
385
|
+
with open(manifest_path, encoding="utf-8") as f:
|
|
386
|
+
return json.load(f)
|
|
387
|
+
|
|
388
|
+
except Exception as e:
|
|
389
|
+
logger.error(f"Failed to load skills manifest: {e}")
|
|
390
|
+
print(f"\n❌ Failed to load skills manifest: {e}")
|
|
391
|
+
return None
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def get_agent_skill_dependencies(config: UnifiedConfig) -> List[str]:
|
|
395
|
+
"""Get skill dependencies from deployed agents.
|
|
396
|
+
|
|
397
|
+
Args:
|
|
398
|
+
config: UnifiedConfig instance
|
|
399
|
+
|
|
400
|
+
Returns:
|
|
401
|
+
List of skill IDs required by enabled agents
|
|
402
|
+
"""
|
|
403
|
+
try:
|
|
404
|
+
from claude_mpm.services.agents.deployment.deployment_reconciler import (
|
|
405
|
+
DeploymentReconciler,
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
reconciler = DeploymentReconciler(config)
|
|
409
|
+
enabled_agents = config.agents.enabled
|
|
410
|
+
|
|
411
|
+
if not enabled_agents:
|
|
412
|
+
logger.debug("No enabled agents, no skill dependencies")
|
|
413
|
+
return []
|
|
414
|
+
|
|
415
|
+
# Get skill dependencies
|
|
416
|
+
skill_deps = reconciler._get_agent_skill_dependencies(enabled_agents)
|
|
417
|
+
return list(skill_deps)
|
|
418
|
+
|
|
419
|
+
except Exception as e:
|
|
420
|
+
logger.warning(f"Failed to get agent skill dependencies: {e}")
|
|
421
|
+
return []
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def get_deployed_skills() -> Set[str]:
|
|
425
|
+
"""Get skills currently deployed in .claude/skills/ directory.
|
|
426
|
+
|
|
427
|
+
Returns:
|
|
428
|
+
Set of deployed skill IDs
|
|
429
|
+
"""
|
|
430
|
+
try:
|
|
431
|
+
from claude_mpm.services.agents.deployment.deployment_reconciler import (
|
|
432
|
+
DeploymentReconciler,
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
config = UnifiedConfig()
|
|
436
|
+
reconciler = DeploymentReconciler(config)
|
|
437
|
+
|
|
438
|
+
# Get path to deployed skills directory
|
|
439
|
+
path_manager = get_path_manager()
|
|
440
|
+
deploy_dir = path_manager.get_deploy_dir() / "skills"
|
|
441
|
+
|
|
442
|
+
# Use reconciler's method to list deployed skills
|
|
443
|
+
return reconciler._list_deployed_skills(deploy_dir)
|
|
444
|
+
|
|
445
|
+
except Exception as e:
|
|
446
|
+
logger.warning(f"Failed to get deployed skills: {e}")
|
|
447
|
+
return set()
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
def run_skill_selector() -> Optional[List[str]]:
|
|
451
|
+
"""Main entry point for skill selector.
|
|
452
|
+
|
|
453
|
+
Returns:
|
|
454
|
+
List of selected skill IDs, or None if cancelled
|
|
455
|
+
"""
|
|
456
|
+
try:
|
|
457
|
+
# Load config
|
|
458
|
+
config = UnifiedConfig()
|
|
459
|
+
|
|
460
|
+
# Load manifest
|
|
461
|
+
manifest = load_skills_manifest()
|
|
462
|
+
if not manifest:
|
|
463
|
+
return None
|
|
464
|
+
|
|
465
|
+
# Get agent skill dependencies
|
|
466
|
+
agent_deps = get_agent_skill_dependencies(config)
|
|
467
|
+
|
|
468
|
+
# Get deployed skills
|
|
469
|
+
deployed = get_deployed_skills()
|
|
470
|
+
|
|
471
|
+
# Run selector
|
|
472
|
+
selector = SkillSelector(manifest, agent_deps, deployed)
|
|
473
|
+
return selector.select_skills()
|
|
474
|
+
|
|
475
|
+
except KeyboardInterrupt:
|
|
476
|
+
print("\n\n❌ Skill selection cancelled")
|
|
477
|
+
return None
|
|
478
|
+
except Exception as e:
|
|
479
|
+
logger.error(f"Skill selection error: {e}", exc_info=True)
|
|
480
|
+
print(f"\n❌ Skill selection error: {e}")
|
|
481
|
+
return None
|
|
@@ -125,7 +125,7 @@ def _get_enhanced_version(base_version: str) -> str:
|
|
|
125
125
|
|
|
126
126
|
if enhanced and enhanced != base_version:
|
|
127
127
|
return enhanced
|
|
128
|
-
except Exception:
|
|
128
|
+
except Exception: # nosec B110
|
|
129
129
|
# If anything fails, fall back to base version
|
|
130
130
|
pass
|
|
131
131
|
|
|
@@ -292,6 +292,21 @@ def add_top_level_run_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
292
292
|
action="store_true",
|
|
293
293
|
help="Force rebuild of all system agents by deleting local claude-mpm agents",
|
|
294
294
|
)
|
|
295
|
+
run_group.add_argument(
|
|
296
|
+
"--force-sync",
|
|
297
|
+
action="store_true",
|
|
298
|
+
help="Force refresh agents and skills from remote repos, bypassing ETag cache",
|
|
299
|
+
)
|
|
300
|
+
run_group.add_argument(
|
|
301
|
+
"--chrome",
|
|
302
|
+
action="store_true",
|
|
303
|
+
help="Enable Claude in Chrome integration (passed to Claude Code)",
|
|
304
|
+
)
|
|
305
|
+
run_group.add_argument(
|
|
306
|
+
"--no-chrome",
|
|
307
|
+
action="store_true",
|
|
308
|
+
help="Disable Claude in Chrome integration (passed to Claude Code)",
|
|
309
|
+
)
|
|
295
310
|
|
|
296
311
|
# Dependency checking options (for backward compatibility at top level)
|
|
297
312
|
dep_group_top = parser.add_argument_group(
|
|
@@ -487,6 +502,13 @@ def create_parser(
|
|
|
487
502
|
except ImportError:
|
|
488
503
|
pass
|
|
489
504
|
|
|
505
|
+
try:
|
|
506
|
+
from .commander_parser import add_commander_subparser
|
|
507
|
+
|
|
508
|
+
add_commander_subparser(subparsers)
|
|
509
|
+
except ImportError:
|
|
510
|
+
pass
|
|
511
|
+
|
|
490
512
|
# Add uninstall command parser
|
|
491
513
|
try:
|
|
492
514
|
from ..commands.uninstall import add_uninstall_parser
|
|
@@ -602,6 +624,59 @@ def create_parser(
|
|
|
602
624
|
help="Skip confirmation prompts",
|
|
603
625
|
)
|
|
604
626
|
|
|
627
|
+
# Add autotodos command for auto-generating todos from hook errors
|
|
628
|
+
autotodos_parser = subparsers.add_parser(
|
|
629
|
+
"autotodos",
|
|
630
|
+
help="Auto-generate todos from hook errors and delegation patterns",
|
|
631
|
+
)
|
|
632
|
+
autotodos_parser.add_argument(
|
|
633
|
+
"autotodos_command",
|
|
634
|
+
nargs="?",
|
|
635
|
+
choices=["list", "inject", "clear", "status", "scan", "violations"],
|
|
636
|
+
help="AutoTodos subcommand",
|
|
637
|
+
)
|
|
638
|
+
autotodos_parser.add_argument(
|
|
639
|
+
"text",
|
|
640
|
+
nargs="?",
|
|
641
|
+
help="Text to scan for delegation patterns (scan command only)",
|
|
642
|
+
)
|
|
643
|
+
autotodos_parser.add_argument(
|
|
644
|
+
"--format",
|
|
645
|
+
choices=["table", "json"],
|
|
646
|
+
default="table",
|
|
647
|
+
help="Output format for list/scan commands",
|
|
648
|
+
)
|
|
649
|
+
autotodos_parser.add_argument(
|
|
650
|
+
"--output",
|
|
651
|
+
help="Output file path for inject command",
|
|
652
|
+
)
|
|
653
|
+
autotodos_parser.add_argument(
|
|
654
|
+
"--error-key",
|
|
655
|
+
help="Specific error key to clear",
|
|
656
|
+
)
|
|
657
|
+
autotodos_parser.add_argument(
|
|
658
|
+
"--event-type",
|
|
659
|
+
choices=["error", "violation", "all"],
|
|
660
|
+
default="all",
|
|
661
|
+
help="Type of events to clear (clear command only)",
|
|
662
|
+
)
|
|
663
|
+
autotodos_parser.add_argument(
|
|
664
|
+
"--file",
|
|
665
|
+
"-f",
|
|
666
|
+
help="Scan text from file (scan command only)",
|
|
667
|
+
)
|
|
668
|
+
autotodos_parser.add_argument(
|
|
669
|
+
"--save",
|
|
670
|
+
action="store_true",
|
|
671
|
+
help="Save detections to event log (scan command only)",
|
|
672
|
+
)
|
|
673
|
+
autotodos_parser.add_argument(
|
|
674
|
+
"-y",
|
|
675
|
+
"--yes",
|
|
676
|
+
action="store_true",
|
|
677
|
+
help="Skip confirmation prompts",
|
|
678
|
+
)
|
|
679
|
+
|
|
605
680
|
# Add summarize command
|
|
606
681
|
from ..commands.summarize import add_summarize_parser
|
|
607
682
|
|