claude-mpm 5.4.65__py3-none-any.whl → 5.6.10__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 +107 -1928
- 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 +46 -0
- claude_mpm/cli/commands/configure.py +620 -21
- 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 +2 -2
- 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 +83 -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 +5 -0
- claude_mpm/cli/startup.py +203 -359
- claude_mpm/cli/startup_display.py +72 -5
- claude_mpm/cli/startup_logging.py +2 -2
- claude_mpm/cli/utils.py +7 -3
- claude_mpm/commander/__init__.py +72 -0
- claude_mpm/commander/adapters/__init__.py +31 -0
- claude_mpm/commander/adapters/base.py +191 -0
- claude_mpm/commander/adapters/claude_code.py +361 -0
- claude_mpm/commander/adapters/communication.py +366 -0
- claude_mpm/commander/api/__init__.py +16 -0
- claude_mpm/commander/api/app.py +105 -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 +228 -0
- claude_mpm/commander/api/routes/work.py +260 -0
- claude_mpm/commander/api/schemas.py +182 -0
- claude_mpm/commander/chat/__init__.py +7 -0
- claude_mpm/commander/chat/cli.py +107 -0
- claude_mpm/commander/chat/commands.py +96 -0
- claude_mpm/commander/chat/repl.py +310 -0
- claude_mpm/commander/config.py +49 -0
- claude_mpm/commander/config_loader.py +115 -0
- claude_mpm/commander/daemon.py +398 -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 +143 -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 +337 -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/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 +404 -0
- claude_mpm/commander/runtime/__init__.py +10 -0
- claude_mpm/commander/runtime/executor.py +191 -0
- claude_mpm/commander/runtime/monitor.py +316 -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 +189 -0
- claude_mpm/commander/work/queue.py +405 -0
- claude_mpm/commander/workflow/__init__.py +27 -0
- claude_mpm/commander/workflow/event_handler.py +219 -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 +2 -2
- claude_mpm/core/config.py +32 -19
- claude_mpm/core/hook_manager.py +51 -3
- claude_mpm/core/interactive_session.py +7 -7
- claude_mpm/core/logger.py +26 -9
- claude_mpm/core/logging_utils.py +35 -11
- claude_mpm/core/output_style_manager.py +31 -13
- 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/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
- 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/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
- 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 +9 -9
- 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-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +283 -87
- claude_mpm/hooks/claude_hooks/hook_handler.py +106 -89
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +116 -8
- claude_mpm/hooks/claude_hooks/memory_integration.py +51 -31
- claude_mpm/hooks/claude_hooks/response_tracking.py +42 -59
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-314.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__/connection_manager_http.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-314.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +39 -24
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
- claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
- claude_mpm/hooks/session_resume_hook.py +89 -1
- claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
- claude_mpm/init.py +1 -1
- claude_mpm/scripts/claude-hook-handler.sh +43 -16
- 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/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- 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/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/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/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 -2
- claude_mpm/services/monitor/server.py +106 -16
- claude_mpm/services/pm_skills_deployer.py +259 -87
- claude_mpm/services/skills/git_skill_source_manager.py +135 -11
- claude_mpm/services/skills/selective_skill_deployer.py +142 -26
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills_deployer.py +31 -5
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/main.py +12 -4
- 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-doctor/SKILL.md +53 -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-session-management/SKILL.md +312 -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-tool-usage-guide/SKILL.md +386 -0
- claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
- claude_mpm/skills/skill_manager.py +4 -4
- claude_mpm/utils/agent_dependency_loader.py +4 -2
- claude_mpm/utils/robust_installer.py +10 -6
- claude_mpm-5.6.10.dist-info/METADATA +391 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/RECORD +303 -181
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
- claude_mpm-5.4.65.dist-info/METADATA +0 -999
- /claude_mpm/skills/bundled/pm/{pm-delegation-patterns → mpm-delegation-patterns}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-git-file-tracking → mpm-git-file-tracking}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-pr-workflow → mpm-pr-workflow}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-ticketing-integration → mpm-ticketing-integration}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-verification-protocols → mpm-verification-protocols}/SKILL.md +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/top_level.txt +0 -0
|
@@ -95,10 +95,10 @@ class DaemonManager:
|
|
|
95
95
|
def _get_default_log_file(self) -> Path:
|
|
96
96
|
"""Get default log file path with port number to support multiple daemons."""
|
|
97
97
|
project_root = Path.cwd()
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
logs_dir = project_root / ".claude-mpm" / "logs"
|
|
99
|
+
logs_dir.mkdir(parents=True, exist_ok=True)
|
|
100
100
|
# Include port in filename to support multiple daemon instances
|
|
101
|
-
return
|
|
101
|
+
return logs_dir / f"monitor-daemon-{self.port}.log"
|
|
102
102
|
|
|
103
103
|
def cleanup_port_conflicts(self, max_retries: int = 3) -> bool:
|
|
104
104
|
"""Clean up any processes using the daemon port.
|
|
@@ -649,14 +649,24 @@ class DaemonManager:
|
|
|
649
649
|
|
|
650
650
|
# Wait for the subprocess to write its PID file and bind to port
|
|
651
651
|
# The subprocess will write the PID file after it starts successfully
|
|
652
|
-
|
|
652
|
+
# Allow configuration via environment variable (default 30s to account for agent/skill sync)
|
|
653
|
+
max_wait = int(os.environ.get("CLAUDE_MPM_MONITOR_TIMEOUT", "30"))
|
|
653
654
|
start_time = time.time()
|
|
654
655
|
pid_file_found = False
|
|
655
656
|
port_bound = False
|
|
657
|
+
last_progress_log = 0.0
|
|
656
658
|
|
|
657
659
|
self.logger.debug(f"Waiting up to {max_wait}s for daemon to start...")
|
|
658
660
|
|
|
659
661
|
while time.time() - start_time < max_wait:
|
|
662
|
+
# Log progress every 5 seconds to show we're waiting
|
|
663
|
+
elapsed = time.time() - start_time
|
|
664
|
+
if elapsed - last_progress_log >= 5.0:
|
|
665
|
+
self.logger.info(
|
|
666
|
+
f"Waiting for monitor daemon... ({int(elapsed)}s elapsed, syncing agents/skills)"
|
|
667
|
+
)
|
|
668
|
+
last_progress_log = elapsed
|
|
669
|
+
|
|
660
670
|
# Check if process is still running
|
|
661
671
|
returncode = process.poll()
|
|
662
672
|
if returncode is not None:
|
|
@@ -976,6 +986,7 @@ class DaemonManager:
|
|
|
976
986
|
os.dup2(null_in.fileno(), sys.stdin.fileno())
|
|
977
987
|
|
|
978
988
|
# Redirect stdout and stderr to log file
|
|
989
|
+
# Ensure logs directory exists
|
|
979
990
|
self.log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
980
991
|
with self.log_file.open("a") as log_out:
|
|
981
992
|
os.dup2(log_out.fileno(), sys.stdout.fileno())
|
|
@@ -128,12 +128,16 @@ class DaemonLifecycle:
|
|
|
128
128
|
# Redirect stdout and stderr
|
|
129
129
|
if self.log_file:
|
|
130
130
|
# Redirect to log file
|
|
131
|
+
# Ensure logs directory exists
|
|
132
|
+
self.log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
131
133
|
with self.log_file.open("a") as log_out:
|
|
132
134
|
os.dup2(log_out.fileno(), sys.stdout.fileno())
|
|
133
135
|
os.dup2(log_out.fileno(), sys.stderr.fileno())
|
|
134
136
|
else:
|
|
135
137
|
# Default to a daemon log file instead of /dev/null for errors
|
|
136
|
-
default_log =
|
|
138
|
+
default_log = (
|
|
139
|
+
Path.home() / ".claude-mpm" / "logs" / "monitor-daemon.log"
|
|
140
|
+
)
|
|
137
141
|
default_log.parent.mkdir(parents=True, exist_ok=True)
|
|
138
142
|
with default_log.open("a") as log_out:
|
|
139
143
|
os.dup2(log_out.fileno(), sys.stdout.fileno())
|
|
@@ -475,7 +479,9 @@ class DaemonLifecycle:
|
|
|
475
479
|
try:
|
|
476
480
|
# If no log file specified, create a default one
|
|
477
481
|
if not self.log_file:
|
|
478
|
-
default_log =
|
|
482
|
+
default_log = (
|
|
483
|
+
Path.home() / ".claude-mpm" / "logs" / "monitor-daemon.log"
|
|
484
|
+
)
|
|
479
485
|
default_log.parent.mkdir(parents=True, exist_ok=True)
|
|
480
486
|
self.log_file = default_log
|
|
481
487
|
|
|
@@ -368,6 +368,83 @@ class UnifiedMonitorServer:
|
|
|
368
368
|
finally:
|
|
369
369
|
await self._cleanup_async()
|
|
370
370
|
|
|
371
|
+
def _categorize_event(self, event_name: str) -> str:
|
|
372
|
+
"""Categorize event by name to determine Socket.IO event type.
|
|
373
|
+
|
|
374
|
+
Maps specific event names to their category for frontend filtering.
|
|
375
|
+
|
|
376
|
+
Args:
|
|
377
|
+
event_name: The raw event name (e.g., "subagent_start", "todo_updated")
|
|
378
|
+
|
|
379
|
+
Returns:
|
|
380
|
+
Category name (e.g., "hook_event", "system_event")
|
|
381
|
+
"""
|
|
382
|
+
# Hook events - agent lifecycle and todo updates
|
|
383
|
+
if event_name in ("subagent_start", "subagent_stop", "todo_updated"):
|
|
384
|
+
return "hook_event"
|
|
385
|
+
|
|
386
|
+
# Tool events - both hook-style and direct tool events
|
|
387
|
+
if event_name in (
|
|
388
|
+
"pre_tool",
|
|
389
|
+
"post_tool",
|
|
390
|
+
"tool.start",
|
|
391
|
+
"tool.end",
|
|
392
|
+
"tool_use",
|
|
393
|
+
"tool_result",
|
|
394
|
+
):
|
|
395
|
+
return "tool_event"
|
|
396
|
+
|
|
397
|
+
# Session events - session lifecycle
|
|
398
|
+
if event_name in (
|
|
399
|
+
"session.started",
|
|
400
|
+
"session.ended",
|
|
401
|
+
"session_start",
|
|
402
|
+
"session_end",
|
|
403
|
+
):
|
|
404
|
+
return "session_event"
|
|
405
|
+
|
|
406
|
+
# Response events - API response lifecycle
|
|
407
|
+
if event_name in (
|
|
408
|
+
"response.start",
|
|
409
|
+
"response.end",
|
|
410
|
+
"response_started",
|
|
411
|
+
"response_ended",
|
|
412
|
+
):
|
|
413
|
+
return "response_event"
|
|
414
|
+
|
|
415
|
+
# Agent events - agent delegation and returns
|
|
416
|
+
if event_name in (
|
|
417
|
+
"agent.delegated",
|
|
418
|
+
"agent.returned",
|
|
419
|
+
"agent_start",
|
|
420
|
+
"agent_end",
|
|
421
|
+
):
|
|
422
|
+
return "agent_event"
|
|
423
|
+
|
|
424
|
+
# File events - file operations
|
|
425
|
+
if event_name in (
|
|
426
|
+
"file.read",
|
|
427
|
+
"file.write",
|
|
428
|
+
"file.edit",
|
|
429
|
+
"file_read",
|
|
430
|
+
"file_write",
|
|
431
|
+
):
|
|
432
|
+
return "file_event"
|
|
433
|
+
|
|
434
|
+
# Claude API events
|
|
435
|
+
if event_name in ("user_prompt", "assistant_message"):
|
|
436
|
+
return "claude_event"
|
|
437
|
+
|
|
438
|
+
# System events
|
|
439
|
+
if event_name in ("system_ready", "system_shutdown"):
|
|
440
|
+
return "system_event"
|
|
441
|
+
|
|
442
|
+
# Log uncategorized events for debugging
|
|
443
|
+
self.logger.debug(f"Uncategorized event: {event_name}")
|
|
444
|
+
|
|
445
|
+
# Default to claude_event for unknown events
|
|
446
|
+
return "claude_event"
|
|
447
|
+
|
|
371
448
|
def _setup_event_handlers(self):
|
|
372
449
|
"""Setup Socket.IO event handlers."""
|
|
373
450
|
try:
|
|
@@ -474,7 +551,7 @@ class UnifiedMonitorServer:
|
|
|
474
551
|
)
|
|
475
552
|
if version_file.exists():
|
|
476
553
|
version = version_file.read_text().strip()
|
|
477
|
-
except Exception:
|
|
554
|
+
except Exception: # nosec B110
|
|
478
555
|
pass
|
|
479
556
|
|
|
480
557
|
return web.json_response(
|
|
@@ -499,10 +576,23 @@ class UnifiedMonitorServer:
|
|
|
499
576
|
event = data.get("event", "claude_event")
|
|
500
577
|
event_data = data.get("data", {})
|
|
501
578
|
|
|
502
|
-
#
|
|
579
|
+
# Categorize event and wrap in expected format
|
|
580
|
+
event_type = self._categorize_event(event)
|
|
581
|
+
wrapped_event = {
|
|
582
|
+
"type": event_type,
|
|
583
|
+
"subtype": event,
|
|
584
|
+
"data": event_data,
|
|
585
|
+
"timestamp": event_data.get("timestamp")
|
|
586
|
+
or datetime.now(timezone.utc).isoformat() + "Z",
|
|
587
|
+
"session_id": event_data.get("session_id"),
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
# Emit to Socket.IO clients via the categorized event type
|
|
503
591
|
if self.sio:
|
|
504
|
-
await self.sio.emit(
|
|
505
|
-
self.logger.debug(
|
|
592
|
+
await self.sio.emit(event_type, wrapped_event)
|
|
593
|
+
self.logger.debug(
|
|
594
|
+
f"HTTP event forwarded to Socket.IO: {event} -> {event_type}"
|
|
595
|
+
)
|
|
506
596
|
|
|
507
597
|
return web.Response(status=204) # No content response
|
|
508
598
|
|
|
@@ -859,7 +949,7 @@ class UnifiedMonitorServer:
|
|
|
859
949
|
# Configuration endpoint for dashboard initialization
|
|
860
950
|
async def config_handler(request):
|
|
861
951
|
"""Return configuration for dashboard initialization."""
|
|
862
|
-
import subprocess
|
|
952
|
+
import subprocess # nosec B404
|
|
863
953
|
|
|
864
954
|
config = {
|
|
865
955
|
"workingDirectory": Path.cwd(),
|
|
@@ -870,7 +960,7 @@ class UnifiedMonitorServer:
|
|
|
870
960
|
|
|
871
961
|
# Try to get current git branch
|
|
872
962
|
try:
|
|
873
|
-
result = subprocess.run(
|
|
963
|
+
result = subprocess.run( # nosec B603 B607
|
|
874
964
|
["git", "branch", "--show-current"],
|
|
875
965
|
capture_output=True,
|
|
876
966
|
text=True,
|
|
@@ -880,7 +970,7 @@ class UnifiedMonitorServer:
|
|
|
880
970
|
)
|
|
881
971
|
if result.returncode == 0 and result.stdout.strip():
|
|
882
972
|
config["gitBranch"] = result.stdout.strip()
|
|
883
|
-
except Exception:
|
|
973
|
+
except Exception: # nosec B110
|
|
884
974
|
pass # Keep default "Unknown" value
|
|
885
975
|
|
|
886
976
|
return web.json_response(config)
|
|
@@ -910,7 +1000,7 @@ class UnifiedMonitorServer:
|
|
|
910
1000
|
# Git history handler
|
|
911
1001
|
async def git_history_handler(request: web.Request) -> web.Response:
|
|
912
1002
|
"""Get git history for a file."""
|
|
913
|
-
import subprocess
|
|
1003
|
+
import subprocess # nosec B404
|
|
914
1004
|
|
|
915
1005
|
try:
|
|
916
1006
|
data = await request.json()
|
|
@@ -939,7 +1029,7 @@ class UnifiedMonitorServer:
|
|
|
939
1029
|
)
|
|
940
1030
|
|
|
941
1031
|
# Get git log for file
|
|
942
|
-
result = subprocess.run(
|
|
1032
|
+
result = subprocess.run( # nosec B603 B607
|
|
943
1033
|
[
|
|
944
1034
|
"git",
|
|
945
1035
|
"log",
|
|
@@ -978,7 +1068,7 @@ class UnifiedMonitorServer:
|
|
|
978
1068
|
# Git diff handler
|
|
979
1069
|
async def git_diff_handler(request: web.Request) -> web.Response:
|
|
980
1070
|
"""Get git diff for a file with optional commit selection."""
|
|
981
|
-
import subprocess
|
|
1071
|
+
import subprocess # nosec B404
|
|
982
1072
|
|
|
983
1073
|
try:
|
|
984
1074
|
file_path = request.query.get("path", "")
|
|
@@ -1010,7 +1100,7 @@ class UnifiedMonitorServer:
|
|
|
1010
1100
|
)
|
|
1011
1101
|
|
|
1012
1102
|
# Find git repository root
|
|
1013
|
-
git_root_result = subprocess.run(
|
|
1103
|
+
git_root_result = subprocess.run( # nosec B603 B607
|
|
1014
1104
|
["git", "rev-parse", "--show-toplevel"],
|
|
1015
1105
|
check=False,
|
|
1016
1106
|
capture_output=True,
|
|
@@ -1034,7 +1124,7 @@ class UnifiedMonitorServer:
|
|
|
1034
1124
|
git_root = Path(git_root_result.stdout.strip())
|
|
1035
1125
|
|
|
1036
1126
|
# Check if file is tracked by git
|
|
1037
|
-
ls_files_result = subprocess.run(
|
|
1127
|
+
ls_files_result = subprocess.run( # nosec B603 B607
|
|
1038
1128
|
["git", "ls-files", "--error-unmatch", str(path)],
|
|
1039
1129
|
check=False,
|
|
1040
1130
|
capture_output=True,
|
|
@@ -1056,7 +1146,7 @@ class UnifiedMonitorServer:
|
|
|
1056
1146
|
)
|
|
1057
1147
|
|
|
1058
1148
|
# Get commit history for this file (last 5 commits)
|
|
1059
|
-
history_result = subprocess.run(
|
|
1149
|
+
history_result = subprocess.run( # nosec B603 B607
|
|
1060
1150
|
[
|
|
1061
1151
|
"git",
|
|
1062
1152
|
"log",
|
|
@@ -1087,7 +1177,7 @@ class UnifiedMonitorServer:
|
|
|
1087
1177
|
)
|
|
1088
1178
|
|
|
1089
1179
|
# Check for uncommitted changes
|
|
1090
|
-
uncommitted_result = subprocess.run(
|
|
1180
|
+
uncommitted_result = subprocess.run( # nosec B603 B607
|
|
1091
1181
|
["git", "diff", "HEAD", str(path)],
|
|
1092
1182
|
check=False,
|
|
1093
1183
|
capture_output=True,
|
|
@@ -1100,7 +1190,7 @@ class UnifiedMonitorServer:
|
|
|
1100
1190
|
# Get diff based on commit parameter
|
|
1101
1191
|
if commit_hash:
|
|
1102
1192
|
# Get diff for specific commit
|
|
1103
|
-
result = subprocess.run(
|
|
1193
|
+
result = subprocess.run( # nosec B603 B607
|
|
1104
1194
|
["git", "show", commit_hash, "--", str(path)],
|
|
1105
1195
|
check=False,
|
|
1106
1196
|
capture_output=True,
|
|
@@ -1469,7 +1559,7 @@ class UnifiedMonitorServer:
|
|
|
1469
1559
|
gather = asyncio.gather(*tasks_to_cancel, return_exceptions=True)
|
|
1470
1560
|
try:
|
|
1471
1561
|
loop.run_until_complete(gather)
|
|
1472
|
-
except Exception:
|
|
1562
|
+
except Exception: # nosec B110
|
|
1473
1563
|
# Some tasks might fail to cancel, that's ok
|
|
1474
1564
|
pass
|
|
1475
1565
|
|