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.

Files changed (313) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
  3. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +107 -1928
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +119 -689
  6. claude_mpm/agents/WORKFLOW.md +2 -0
  7. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  8. claude_mpm/cli/__init__.py +5 -1
  9. claude_mpm/cli/commands/agents.py +2 -4
  10. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  11. claude_mpm/cli/commands/autotodos.py +566 -0
  12. claude_mpm/cli/commands/commander.py +46 -0
  13. claude_mpm/cli/commands/configure.py +620 -21
  14. claude_mpm/cli/commands/hook_errors.py +60 -60
  15. claude_mpm/cli/commands/monitor.py +2 -2
  16. claude_mpm/cli/commands/mpm_init/core.py +2 -2
  17. claude_mpm/cli/commands/run.py +35 -3
  18. claude_mpm/cli/commands/skill_source.py +51 -2
  19. claude_mpm/cli/commands/skills.py +171 -17
  20. claude_mpm/cli/executor.py +120 -16
  21. claude_mpm/cli/interactive/__init__.py +10 -0
  22. claude_mpm/cli/interactive/agent_wizard.py +30 -50
  23. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  24. claude_mpm/cli/interactive/skill_selector.py +481 -0
  25. claude_mpm/cli/parsers/base_parser.py +76 -1
  26. claude_mpm/cli/parsers/commander_parser.py +83 -0
  27. claude_mpm/cli/parsers/run_parser.py +10 -0
  28. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  29. claude_mpm/cli/parsers/skills_parser.py +5 -0
  30. claude_mpm/cli/startup.py +203 -359
  31. claude_mpm/cli/startup_display.py +72 -5
  32. claude_mpm/cli/startup_logging.py +2 -2
  33. claude_mpm/cli/utils.py +7 -3
  34. claude_mpm/commander/__init__.py +72 -0
  35. claude_mpm/commander/adapters/__init__.py +31 -0
  36. claude_mpm/commander/adapters/base.py +191 -0
  37. claude_mpm/commander/adapters/claude_code.py +361 -0
  38. claude_mpm/commander/adapters/communication.py +366 -0
  39. claude_mpm/commander/api/__init__.py +16 -0
  40. claude_mpm/commander/api/app.py +105 -0
  41. claude_mpm/commander/api/errors.py +133 -0
  42. claude_mpm/commander/api/routes/__init__.py +8 -0
  43. claude_mpm/commander/api/routes/events.py +184 -0
  44. claude_mpm/commander/api/routes/inbox.py +171 -0
  45. claude_mpm/commander/api/routes/messages.py +148 -0
  46. claude_mpm/commander/api/routes/projects.py +271 -0
  47. claude_mpm/commander/api/routes/sessions.py +228 -0
  48. claude_mpm/commander/api/routes/work.py +260 -0
  49. claude_mpm/commander/api/schemas.py +182 -0
  50. claude_mpm/commander/chat/__init__.py +7 -0
  51. claude_mpm/commander/chat/cli.py +107 -0
  52. claude_mpm/commander/chat/commands.py +96 -0
  53. claude_mpm/commander/chat/repl.py +310 -0
  54. claude_mpm/commander/config.py +49 -0
  55. claude_mpm/commander/config_loader.py +115 -0
  56. claude_mpm/commander/daemon.py +398 -0
  57. claude_mpm/commander/events/__init__.py +26 -0
  58. claude_mpm/commander/events/manager.py +332 -0
  59. claude_mpm/commander/frameworks/__init__.py +12 -0
  60. claude_mpm/commander/frameworks/base.py +143 -0
  61. claude_mpm/commander/frameworks/claude_code.py +58 -0
  62. claude_mpm/commander/frameworks/mpm.py +62 -0
  63. claude_mpm/commander/inbox/__init__.py +16 -0
  64. claude_mpm/commander/inbox/dedup.py +128 -0
  65. claude_mpm/commander/inbox/inbox.py +224 -0
  66. claude_mpm/commander/inbox/models.py +70 -0
  67. claude_mpm/commander/instance_manager.py +337 -0
  68. claude_mpm/commander/llm/__init__.py +6 -0
  69. claude_mpm/commander/llm/openrouter_client.py +167 -0
  70. claude_mpm/commander/llm/summarizer.py +70 -0
  71. claude_mpm/commander/models/__init__.py +18 -0
  72. claude_mpm/commander/models/events.py +121 -0
  73. claude_mpm/commander/models/project.py +162 -0
  74. claude_mpm/commander/models/work.py +214 -0
  75. claude_mpm/commander/parsing/__init__.py +20 -0
  76. claude_mpm/commander/parsing/extractor.py +132 -0
  77. claude_mpm/commander/parsing/output_parser.py +270 -0
  78. claude_mpm/commander/parsing/patterns.py +100 -0
  79. claude_mpm/commander/persistence/__init__.py +11 -0
  80. claude_mpm/commander/persistence/event_store.py +274 -0
  81. claude_mpm/commander/persistence/state_store.py +309 -0
  82. claude_mpm/commander/persistence/work_store.py +164 -0
  83. claude_mpm/commander/polling/__init__.py +13 -0
  84. claude_mpm/commander/polling/event_detector.py +104 -0
  85. claude_mpm/commander/polling/output_buffer.py +49 -0
  86. claude_mpm/commander/polling/output_poller.py +153 -0
  87. claude_mpm/commander/project_session.py +268 -0
  88. claude_mpm/commander/proxy/__init__.py +12 -0
  89. claude_mpm/commander/proxy/formatter.py +89 -0
  90. claude_mpm/commander/proxy/output_handler.py +191 -0
  91. claude_mpm/commander/proxy/relay.py +155 -0
  92. claude_mpm/commander/registry.py +404 -0
  93. claude_mpm/commander/runtime/__init__.py +10 -0
  94. claude_mpm/commander/runtime/executor.py +191 -0
  95. claude_mpm/commander/runtime/monitor.py +316 -0
  96. claude_mpm/commander/session/__init__.py +6 -0
  97. claude_mpm/commander/session/context.py +81 -0
  98. claude_mpm/commander/session/manager.py +59 -0
  99. claude_mpm/commander/tmux_orchestrator.py +361 -0
  100. claude_mpm/commander/web/__init__.py +1 -0
  101. claude_mpm/commander/work/__init__.py +30 -0
  102. claude_mpm/commander/work/executor.py +189 -0
  103. claude_mpm/commander/work/queue.py +405 -0
  104. claude_mpm/commander/workflow/__init__.py +27 -0
  105. claude_mpm/commander/workflow/event_handler.py +219 -0
  106. claude_mpm/commander/workflow/notifier.py +146 -0
  107. claude_mpm/commands/mpm-config.md +8 -0
  108. claude_mpm/commands/mpm-doctor.md +8 -0
  109. claude_mpm/commands/mpm-help.md +8 -0
  110. claude_mpm/commands/mpm-init.md +8 -0
  111. claude_mpm/commands/mpm-monitor.md +8 -0
  112. claude_mpm/commands/mpm-organize.md +8 -0
  113. claude_mpm/commands/mpm-postmortem.md +8 -0
  114. claude_mpm/commands/mpm-session-resume.md +9 -1
  115. claude_mpm/commands/mpm-status.md +8 -0
  116. claude_mpm/commands/mpm-ticket-view.md +8 -0
  117. claude_mpm/commands/mpm-version.md +8 -0
  118. claude_mpm/commands/mpm.md +8 -0
  119. claude_mpm/config/agent_presets.py +8 -7
  120. claude_mpm/config/skill_sources.py +16 -0
  121. claude_mpm/constants.py +1 -0
  122. claude_mpm/core/claude_runner.py +2 -2
  123. claude_mpm/core/config.py +32 -19
  124. claude_mpm/core/hook_manager.py +51 -3
  125. claude_mpm/core/interactive_session.py +7 -7
  126. claude_mpm/core/logger.py +26 -9
  127. claude_mpm/core/logging_utils.py +35 -11
  128. claude_mpm/core/output_style_manager.py +31 -13
  129. claude_mpm/core/unified_config.py +54 -8
  130. claude_mpm/core/unified_paths.py +95 -90
  131. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  132. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  133. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
  134. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
  135. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
  136. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
  137. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
  138. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
  139. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
  140. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
  141. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
  142. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
  143. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
  144. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
  145. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
  146. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  147. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  148. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
  149. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
  150. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
  151. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
  152. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
  153. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
  154. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
  155. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
  156. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  157. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
  158. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
  159. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
  160. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
  161. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
  162. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
  163. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
  164. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
  165. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
  166. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
  167. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
  168. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
  169. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
  170. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
  171. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
  172. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
  173. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
  174. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
  189. claude_mpm/dashboard/static/svelte-build/index.html +9 -9
  190. claude_mpm/experimental/cli_enhancements.py +2 -1
  191. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  192. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  193. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  194. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  195. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-312.pyc +0 -0
  196. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-314.pyc +0 -0
  197. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  198. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-312.pyc +0 -0
  199. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-314.pyc +0 -0
  200. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  201. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-312.pyc +0 -0
  202. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-314.pyc +0 -0
  203. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  204. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-314.pyc +0 -0
  205. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  206. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-312.pyc +0 -0
  207. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-314.pyc +0 -0
  208. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  209. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-312.pyc +0 -0
  210. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-314.pyc +0 -0
  211. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-314.pyc +0 -0
  212. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  213. claude_mpm/hooks/claude_hooks/event_handlers.py +283 -87
  214. claude_mpm/hooks/claude_hooks/hook_handler.py +106 -89
  215. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  216. claude_mpm/hooks/claude_hooks/installer.py +116 -8
  217. claude_mpm/hooks/claude_hooks/memory_integration.py +51 -31
  218. claude_mpm/hooks/claude_hooks/response_tracking.py +42 -59
  219. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-314.pyc +0 -0
  220. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  221. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-312.pyc +0 -0
  222. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-314.pyc +0 -0
  223. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-314.pyc +0 -0
  224. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  225. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-312.pyc +0 -0
  226. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-314.pyc +0 -0
  227. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  228. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-312.pyc +0 -0
  229. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-314.pyc +0 -0
  230. claude_mpm/hooks/claude_hooks/services/connection_manager.py +39 -24
  231. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
  232. claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
  233. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
  234. claude_mpm/hooks/session_resume_hook.py +89 -1
  235. claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
  236. claude_mpm/init.py +1 -1
  237. claude_mpm/scripts/claude-hook-handler.sh +43 -16
  238. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  239. claude_mpm/services/agents/agent_selection_service.py +2 -2
  240. claude_mpm/services/agents/cache_git_manager.py +1 -1
  241. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  242. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
  243. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  244. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  245. claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
  246. claude_mpm/services/agents/startup_sync.py +5 -2
  247. claude_mpm/services/cli/__init__.py +3 -0
  248. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  249. claude_mpm/services/cli/session_resume_helper.py +10 -2
  250. claude_mpm/services/delegation_detector.py +175 -0
  251. claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
  252. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  253. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  254. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  255. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  256. claude_mpm/services/diagnostics/models.py +14 -1
  257. claude_mpm/services/event_log.py +325 -0
  258. claude_mpm/services/infrastructure/__init__.py +4 -0
  259. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  260. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  261. claude_mpm/services/monitor/daemon_manager.py +15 -4
  262. claude_mpm/services/monitor/management/lifecycle.py +8 -2
  263. claude_mpm/services/monitor/server.py +106 -16
  264. claude_mpm/services/pm_skills_deployer.py +259 -87
  265. claude_mpm/services/skills/git_skill_source_manager.py +135 -11
  266. claude_mpm/services/skills/selective_skill_deployer.py +142 -26
  267. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  268. claude_mpm/services/skills_deployer.py +31 -5
  269. claude_mpm/services/socketio/handlers/hook.py +14 -7
  270. claude_mpm/services/socketio/server/main.py +12 -4
  271. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  272. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  273. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  274. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  275. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  276. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  277. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  278. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  279. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  280. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  281. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  282. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  283. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  284. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  285. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  286. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  287. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  288. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  289. claude_mpm/skills/skill_manager.py +4 -4
  290. claude_mpm/utils/agent_dependency_loader.py +4 -2
  291. claude_mpm/utils/robust_installer.py +10 -6
  292. claude_mpm-5.6.10.dist-info/METADATA +391 -0
  293. {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/RECORD +303 -181
  294. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
  295. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
  296. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
  297. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
  298. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
  299. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
  300. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
  301. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
  302. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
  303. claude_mpm-5.4.65.dist-info/METADATA +0 -999
  304. /claude_mpm/skills/bundled/pm/{pm-delegation-patterns → mpm-delegation-patterns}/SKILL.md +0 -0
  305. /claude_mpm/skills/bundled/pm/{pm-git-file-tracking → mpm-git-file-tracking}/SKILL.md +0 -0
  306. /claude_mpm/skills/bundled/pm/{pm-pr-workflow → mpm-pr-workflow}/SKILL.md +0 -0
  307. /claude_mpm/skills/bundled/pm/{pm-ticketing-integration → mpm-ticketing-integration}/SKILL.md +0 -0
  308. /claude_mpm/skills/bundled/pm/{pm-verification-protocols → mpm-verification-protocols}/SKILL.md +0 -0
  309. {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/WHEEL +0 -0
  310. {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/entry_points.txt +0 -0
  311. {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/licenses/LICENSE +0 -0
  312. {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  313. {claude_mpm-5.4.65.dist-info → claude_mpm-5.6.10.dist-info}/top_level.txt +0 -0
@@ -28,7 +28,7 @@ References:
28
28
  import json
29
29
  import platform
30
30
  import shutil
31
- import subprocess
31
+ import subprocess # nosec B404 - subprocess needed for safe git operations
32
32
  from pathlib import Path
33
33
  from typing import Any, Dict, List, Optional
34
34
 
@@ -653,7 +653,7 @@ class SkillsDeployerService(LoggerMixin):
653
653
  f"Updating existing collection '{collection_name}' at {target_dir}"
654
654
  )
655
655
  try:
656
- result = subprocess.run(
656
+ result = subprocess.run( # nosec B603 B607 - Safe: hardcoded git command
657
657
  ["git", "pull"],
658
658
  cwd=target_dir,
659
659
  capture_output=True,
@@ -684,7 +684,7 @@ class SkillsDeployerService(LoggerMixin):
684
684
  f"Installing new collection '{collection_name}' to {target_dir}"
685
685
  )
686
686
  try:
687
- result = subprocess.run(
687
+ result = subprocess.run( # nosec B603 B607 - Safe: hardcoded git command
688
688
  ["git", "clone", repo_url, str(target_dir)],
689
689
  capture_output=True,
690
690
  text=True,
@@ -773,6 +773,32 @@ class SkillsDeployerService(LoggerMixin):
773
773
  if isinstance(skills_data, dict):
774
774
  flat_skills = []
775
775
 
776
+ # Define valid top-level categories
777
+ VALID_CATEGORIES = {"universal", "toolchains"}
778
+
779
+ # Check for unknown categories and warn user
780
+ unknown_categories = set(skills_data.keys()) - VALID_CATEGORIES
781
+ if unknown_categories:
782
+ # Count skills in unknown categories
783
+ skipped_count = 0
784
+ for cat in unknown_categories:
785
+ cat_data = skills_data.get(cat, [])
786
+ if isinstance(cat_data, list):
787
+ skipped_count += len(cat_data)
788
+ elif isinstance(cat_data, dict):
789
+ # If it's a dict like toolchains, count nested skills
790
+ for skills_list in cat_data.values():
791
+ if isinstance(skills_list, list):
792
+ skipped_count += len(skills_list)
793
+
794
+ self.logger.warning(
795
+ f"Unknown categories in manifest will be skipped: "
796
+ f"{', '.join(sorted(unknown_categories))} ({skipped_count} skills)"
797
+ )
798
+ self.logger.info(
799
+ f"Valid top-level categories: {', '.join(sorted(VALID_CATEGORIES))}"
800
+ )
801
+
776
802
  # Add universal skills
777
803
  universal_skills = skills_data.get("universal", [])
778
804
  if isinstance(universal_skills, list):
@@ -1022,12 +1048,12 @@ class SkillsDeployerService(LoggerMixin):
1022
1048
  """
1023
1049
  try:
1024
1050
  if platform.system() == "Windows":
1025
- result = subprocess.run(
1051
+ result = subprocess.run( # nosec B603 B607 - Safe: hardcoded tasklist command
1026
1052
  ["tasklist"], check=False, capture_output=True, text=True, timeout=5
1027
1053
  )
1028
1054
  return "claude" in result.stdout.lower()
1029
1055
  # macOS and Linux
1030
- result = subprocess.run(
1056
+ result = subprocess.run( # nosec B603 B607 - Safe: hardcoded ps command
1031
1057
  ["ps", "aux"], check=False, capture_output=True, text=True, timeout=5
1032
1058
  )
1033
1059
  # Look for "Claude Code" or "claude-code" process
@@ -118,7 +118,8 @@ class HookEventHandler(BaseEventHandler):
118
118
  self.server.active_sessions[session_id] = {
119
119
  "session_id": session_id,
120
120
  "start_time": datetime.now(timezone.utc).isoformat(),
121
- "agent": agent_type,
121
+ "current_agent": agent_type, # Current active agent
122
+ "agents": [agent_type], # All agents used in this session
122
123
  "status": ServiceState.RUNNING,
123
124
  "prompt": data.get("prompt", "")[:100], # First 100 chars
124
125
  "last_activity": datetime.now(timezone.utc).isoformat(),
@@ -169,7 +170,8 @@ class HookEventHandler(BaseEventHandler):
169
170
  self.server.active_sessions[session_id] = {
170
171
  "session_id": session_id,
171
172
  "start_time": datetime.now(timezone.utc).isoformat(),
172
- "agent": "pm", # Default to PM
173
+ "current_agent": "pm", # Current active agent
174
+ "agents": ["pm"], # All agents used in this session
173
175
  "status": ServiceState.RUNNING,
174
176
  "prompt": data.get("prompt_text", "")[:100],
175
177
  "working_directory": data.get("working_directory", ""),
@@ -200,11 +202,16 @@ class HookEventHandler(BaseEventHandler):
200
202
  # Update session with new agent
201
203
  if hasattr(self.server, "active_sessions"):
202
204
  if session_id in self.server.active_sessions:
203
- self.server.active_sessions[session_id]["agent"] = agent_type
204
- self.server.active_sessions[session_id]["status"] = "delegated"
205
- self.server.active_sessions[session_id]["last_activity"] = datetime.now(
206
- timezone.utc
207
- ).isoformat()
205
+ session = self.server.active_sessions[session_id]
206
+ session["current_agent"] = agent_type
207
+ session["status"] = "delegated"
208
+ session["last_activity"] = datetime.now(timezone.utc).isoformat()
209
+
210
+ # Add to agents list if not already present
211
+ if "agents" not in session:
212
+ session["agents"] = []
213
+ if agent_type not in session["agents"]:
214
+ session["agents"].append(agent_type)
208
215
 
209
216
  self.logger.debug(
210
217
  f"Updated session delegation: session={session_id[:8]}..., agent={agent_type}"
@@ -383,7 +383,8 @@ class SocketIOServer(SocketIOServiceInterface):
383
383
  self.active_sessions[session_id] = {
384
384
  "session_id": session_id,
385
385
  "start_time": datetime.now(timezone.utc).isoformat(),
386
- "agent": "pm", # Default to PM, will be updated if delegated
386
+ "current_agent": "pm", # Current active agent
387
+ "agents": ["pm"], # All agents used in this session
387
388
  "status": ServiceState.RUNNING,
388
389
  "launch_method": launch_method,
389
390
  "working_dir": working_dir,
@@ -419,8 +420,15 @@ class SocketIOServer(SocketIOServiceInterface):
419
420
  """Notify agent delegation."""
420
421
  # Update active session with current agent
421
422
  if self.session_id and self.session_id in self.active_sessions:
422
- self.active_sessions[self.session_id]["agent"] = agent
423
- self.active_sessions[self.session_id]["status"] = status
423
+ session = self.active_sessions[self.session_id]
424
+ session["current_agent"] = agent
425
+ session["status"] = status
426
+
427
+ # Add to agents list if not already present
428
+ if "agents" not in session:
429
+ session["agents"] = []
430
+ if agent not in session["agents"]:
431
+ session["agents"].append(agent)
424
432
 
425
433
  if self.broadcaster:
426
434
  self.broadcaster.agent_delegated(agent, task, status)
@@ -480,7 +488,7 @@ class SocketIOServer(SocketIOServiceInterface):
480
488
  start_time = datetime.fromisoformat(session_data["start_time"])
481
489
  if start_time.timestamp() < cutoff_time:
482
490
  sessions_to_remove.append(session_id)
483
- except Exception:
491
+ except Exception: # nosec B110 - Silently skip malformed timestamps
484
492
  pass
485
493
 
486
494
  for session_id in sessions_to_remove:
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: mpm
3
+ description: Access Claude MPM functionality and manage multi-agent orchestration
4
+ user-invocable: true
5
+ version: "1.0.0"
6
+ category: mpm-command
7
+ tags: [mpm-command, system, pm-required]
8
+ ---
9
+
10
+ # /mpm
11
+
12
+ Access Claude MPM functionality and manage your multi-agent orchestration.
13
+
14
+ ## Available MPM Commands
15
+
16
+ - `/mpm-agents` - Show available agents and versions
17
+ - `/mpm-doctor` - Run diagnostic checks
18
+ - `/mpm-help` - Show command help
19
+ - `/mpm-status` - Show MPM status
20
+ - `/mpm-ticket` - Ticketing workflow management (organize, proceed, status, update, project)
21
+ - `/mpm-config` - Manage configuration
22
+ - `/mpm-resume` - Create session resume files
23
+ - `/mpm-version` - Display version information for project, agents, and skills
24
+
25
+ ## What is Claude MPM?
26
+
27
+ Claude MPM extends Claude Code with:
28
+ - **Multi-agent orchestration** - Delegate work to specialized agents
29
+ - **Project-specific PM instructions** - Tailored guidance for your project
30
+ - **Agent memory management** - Context-aware agent interactions
31
+ - **WebSocket monitoring** - Real-time system monitoring
32
+ - **Hook system for automation** - Automate workflows and tasks
33
+
34
+ ## Quick Start
35
+
36
+ Use `/mpm-help` to explore commands or `/mpm-status` to check system health.
37
+
38
+ For more information, use `/mpm-help [command]` for specific command details.
@@ -0,0 +1,75 @@
1
+ # PM Skill: Agent Update Workflow
2
+
3
+ ## Trigger Patterns
4
+ - "update agent", "fix agent", "improve agent", "modify agent"
5
+ - "change {agent-name} agent", "edit agent instructions"
6
+ - Any request to modify agent behavior
7
+
8
+ ## FUNDAMENTAL RULE: Official vs Custom Agents
9
+
10
+ ### Official MPM Agents (NEVER edit deployed copies)
11
+ **Source**: `~/.claude-mpm/cache/agents/` (from bobmatnyc/claude-mpm-agents repo)
12
+ **Deployed**: `.claude/agents/` - READ-ONLY for official agents
13
+
14
+ **Detection**: Check if agent exists in `~/.claude-mpm/cache/agents/`
15
+ - If YES → Official agent → Follow Official Agent Workflow
16
+ - If NO → Custom agent → Can edit `.claude/agents/` directly
17
+
18
+ ### Custom/Localized Agents
19
+ - Created specifically for project
20
+ - Can be edited directly in `.claude/agents/`
21
+ - Not part of official MPM agent set
22
+
23
+ ## Official Agent Update Workflow
24
+
25
+ ### Step 1: Identify Agent Source
26
+ ```bash
27
+ ls ~/.claude-mpm/cache/agents/ # Find the source file
28
+ ```
29
+
30
+ ### Step 2: Update Source
31
+ Edit the agent source in `~/.claude-mpm/cache/agents/{agent-name}.md`
32
+ (or appropriate path based on agent structure)
33
+
34
+ ### Step 3: Rebuild and Redeploy
35
+ Use MPM deployment tools:
36
+ ```bash
37
+ # Redeploy specific agent
38
+ mpm agents deploy {agent-name}
39
+
40
+ # Or redeploy all agents
41
+ mpm agents deploy --all
42
+ ```
43
+
44
+ ### Step 4: Validate (claude-mpm project only)
45
+ When working in the claude-mpm project itself:
46
+ ```bash
47
+ # Run deepeval against deployed agent instructions
48
+ deepeval test --agent {agent-name}
49
+ ```
50
+
51
+ ## Circuit Breaker
52
+
53
+ **BLOCK** if attempting to edit `.claude/agents/{official-agent}.md` directly:
54
+ - Official agents in deployed location are BUILD OUTPUTS
55
+ - Must update source → rebuild → redeploy
56
+ - Violation = architectural breach
57
+
58
+ ## Examples
59
+
60
+ ### ❌ WRONG (Editing deployed official agent)
61
+ ```
62
+ Edit: .claude/agents/web-qa.md # VIOLATION - this is a built output
63
+ ```
64
+
65
+ ### ✅ CORRECT (Updating source and redeploying)
66
+ ```
67
+ 1. Edit: ~/.claude-mpm/cache/agents/web-qa.md # Update source
68
+ 2. Run: mpm agents deploy web-qa # Rebuild/redeploy
69
+ 3. Validate: deepeval test --agent web-qa # (in claude-mpm project)
70
+ ```
71
+
72
+ ### ✅ CORRECT (Custom agent - can edit directly)
73
+ ```
74
+ Edit: .claude/agents/my-custom-agent.md # OK - not an official agent
75
+ ```
@@ -0,0 +1,248 @@
1
+ ---
2
+ name: pm-bug-reporting
3
+ version: "1.0.0"
4
+ description: Bug reporting protocol for PM and agents to file GitHub issues
5
+ when_to_use: Framework bugs, agent errors, skill content errors detected
6
+ category: pm-workflow
7
+ tags: [bug-reporting, github, issues, pm-required]
8
+ ---
9
+
10
+ # PM Bug Reporting Protocol
11
+
12
+ ## When to Report Bugs
13
+
14
+ Report bugs when you encounter:
15
+ - **PM instruction errors** or missing guidance
16
+ - **Agent malfunction** or incorrect behavior
17
+ - **Skill content errors** or outdated information
18
+ - **Framework crashes** or unexpected behavior
19
+ - **Missing or incorrect documentation**
20
+ - **Configuration errors** or invalid defaults
21
+
22
+ ## GitHub Repositories
23
+
24
+ Route bugs to the correct repository:
25
+
26
+ | Bug Type | Repository | Owner/Repo |
27
+ |----------|------------|------------|
28
+ | Core MPM (CLI, startup, config, orchestration) | claude-mpm | bobmatnyc/claude-mpm |
29
+ | Agent bugs (wrong behavior, errors, missing capabilities) | claude-mpm-agents | bobmatnyc/claude-mpm-agents |
30
+ | Skill bugs (wrong info, outdated, missing content) | claude-mpm-skills | bobmatnyc/claude-mpm-skills |
31
+
32
+ ## Bug Report Template
33
+
34
+ When creating an issue, include:
35
+
36
+ ### Title
37
+ Brief, descriptive title (50 chars max)
38
+ - ✅ "PM delegates to non-existent agent"
39
+ - ✅ "Research skill missing web search examples"
40
+ - ❌ "Bug in system"
41
+ - ❌ "Fix this"
42
+
43
+ ### Labels
44
+ Always include:
45
+ - `bug` (required)
46
+ - `agent-reported` (required)
47
+ - Additional context labels:
48
+ - `high-priority` - Critical functionality broken
49
+ - `documentation` - Documentation error
50
+ - `agent-error` - Agent-specific issue
51
+ - `skill-error` - Skill content issue
52
+
53
+ ### Body Structure
54
+ ```markdown
55
+ ## What Happened
56
+ [Clear description of the bug]
57
+
58
+ ## Expected Behavior
59
+ [What should have happened]
60
+
61
+ ## Steps to Reproduce
62
+ 1. [First step]
63
+ 2. [Second step]
64
+ 3. [Third step]
65
+
66
+ ## Context
67
+ - Agent: [agent name if applicable]
68
+ - Skill: [skill name if applicable]
69
+ - Error Message: [full error if available]
70
+ - Version: [MPM version if known]
71
+
72
+ ## Impact
73
+ [How this affects users/workflow]
74
+ ```
75
+
76
+ ## Using gh CLI
77
+
78
+ ### Prerequisites Check
79
+ ```bash
80
+ gh auth status
81
+ ```
82
+
83
+ If not authenticated:
84
+ ```bash
85
+ gh auth login
86
+ ```
87
+
88
+ ### Creating Issues
89
+
90
+ **Delegate to ticketing agent** with:
91
+ ```
92
+ Task:
93
+ agent: ticketing
94
+ task: Create GitHub issue for [bug type]
95
+ context: |
96
+ Repository: bobmatnyc/claude-mpm[-agents|-skills]
97
+ Title: [brief title]
98
+ Labels: bug, agent-reported
99
+ Body: |
100
+ ## What Happened
101
+ [description]
102
+
103
+ ## Expected Behavior
104
+ [expected]
105
+
106
+ ## Steps to Reproduce
107
+ 1. [step 1]
108
+ 2. [step 2]
109
+
110
+ ## Context
111
+ - Agent: [agent name]
112
+ - Error: [error message]
113
+
114
+ ## Impact
115
+ [impact description]
116
+ ```
117
+
118
+ ## Examples
119
+
120
+ ### Core MPM Bug
121
+ ```
122
+ Task:
123
+ agent: ticketing
124
+ task: Create GitHub issue for core MPM bug
125
+ context: |
126
+ Repository: bobmatnyc/claude-mpm
127
+ Title: PM fails to load configuration on startup
128
+ Labels: bug, agent-reported, high-priority
129
+ Body: |
130
+ ## What Happened
131
+ PM fails to initialize when configuration.yaml contains invalid syntax.
132
+ No clear error message shown to user.
133
+
134
+ ## Expected Behavior
135
+ PM should display clear YAML syntax error with line number and fix suggestion.
136
+
137
+ ## Steps to Reproduce
138
+ 1. Add invalid YAML to .claude-mpm/configuration.yaml
139
+ 2. Run `mpm`
140
+ 3. Observe generic error without details
141
+
142
+ ## Context
143
+ - Component: Configuration loader
144
+ - Error: "Failed to load configuration"
145
+ - Version: 5.4.x
146
+
147
+ ## Impact
148
+ Users cannot diagnose configuration errors, requiring manual YAML validation.
149
+ ```
150
+
151
+ ### Agent Bug
152
+ ```
153
+ Task:
154
+ agent: ticketing
155
+ task: Create GitHub issue for agent bug
156
+ context: |
157
+ Repository: bobmatnyc/claude-mpm-agents
158
+ Title: Research agent fails to search with special characters
159
+ Labels: bug, agent-reported, agent-error
160
+ Body: |
161
+ ## What Happened
162
+ Research agent throws error when search query contains quotes or special chars.
163
+
164
+ ## Expected Behavior
165
+ Search queries should be properly escaped and executed.
166
+
167
+ ## Steps to Reproduce
168
+ 1. Delegate to research: "Search for 'React hooks'"
169
+ 2. Research agent attempts search
170
+ 3. Error: "Invalid search query"
171
+
172
+ ## Context
173
+ - Agent: research
174
+ - Error: grep command fails with unescaped quotes
175
+
176
+ ## Impact
177
+ Cannot search for quoted phrases or technical terms with special characters.
178
+ ```
179
+
180
+ ### Skill Bug
181
+ ```
182
+ Task:
183
+ agent: ticketing
184
+ task: Create GitHub issue for skill content error
185
+ context: |
186
+ Repository: bobmatnyc/claude-mpm-skills
187
+ Title: Git workflow skill contains outdated branch strategy
188
+ Labels: bug, agent-reported, documentation, skill-error
189
+ Body: |
190
+ ## What Happened
191
+ Skill recommends `git flow` branching model, which project no longer uses.
192
+ Current standard is trunk-based development.
193
+
194
+ ## Expected Behavior
195
+ Skill should document current trunk-based workflow.
196
+
197
+ ## Context
198
+ - Skill: git-workflow.md
199
+ - Section: "Branching Strategy"
200
+ - Line: 45-60
201
+
202
+ ## Impact
203
+ Agents follow outdated branching model, creating workflow friction.
204
+ ```
205
+
206
+ ## Escalation Path
207
+
208
+ When ticketing agent is unavailable or gh CLI fails:
209
+
210
+ 1. **Log locally** for manual reporting:
211
+ ```
212
+ echo "[BUG] $(date): [description]" >> .claude-mpm/logs/bugs.log
213
+ ```
214
+
215
+ 2. **Report to PM** for alternative action:
216
+ ```
217
+ PM should create ticket in primary ticketing system (Linear/JIRA)
218
+ with note to create GitHub issue once available
219
+ ```
220
+
221
+ 3. **User notification**:
222
+ ```
223
+ "Bug detected: [description]. Logged for manual GitHub issue creation."
224
+ ```
225
+
226
+ ## Success Criteria
227
+
228
+ Bug reporting successful when:
229
+ - ✅ Issue created in correct repository
230
+ - ✅ All required labels applied (`bug`, `agent-reported`)
231
+ - ✅ Body follows template structure
232
+ - ✅ Title is clear and concise
233
+ - ✅ Context includes agent/skill name if applicable
234
+ - ✅ Issue URL returned for tracking
235
+
236
+ ## PM Enforcement
237
+
238
+ PM MUST:
239
+ - Detect bugs during agent interactions
240
+ - Delegate bug reporting to ticketing agent
241
+ - NOT attempt to create GitHub issues directly
242
+ - Follow escalation path if ticketing unavailable
243
+ - Log all bug reports for audit trail
244
+
245
+ ## Related Skills
246
+ - [pm-ticketing-integration.md](pm-ticketing-integration.md) - Ticket delegation patterns
247
+ - [pm-delegation-patterns.md](pm-delegation-patterns.md) - General delegation guidance
248
+ - [ticketing-examples.md](ticketing-examples.md) - Ticketing delegation examples