claude-mpm 4.20.3__py3-none-any.whl → 4.25.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 (454) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +23 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/base_agent.json +6 -3
  7. claude_mpm/agents/frontmatter_validator.py +1 -1
  8. claude_mpm/agents/templates/api_qa.json +5 -2
  9. claude_mpm/agents/templates/circuit_breakers.md +108 -2
  10. claude_mpm/agents/templates/documentation.json +33 -6
  11. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  12. claude_mpm/agents/templates/php-engineer.json +10 -4
  13. claude_mpm/agents/templates/pm_red_flags.md +89 -19
  14. claude_mpm/agents/templates/project_organizer.json +7 -3
  15. claude_mpm/agents/templates/qa.json +2 -1
  16. claude_mpm/agents/templates/react_engineer.json +1 -0
  17. claude_mpm/agents/templates/research.json +82 -12
  18. claude_mpm/agents/templates/security.json +4 -4
  19. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  20. claude_mpm/agents/templates/ticketing.json +10 -6
  21. claude_mpm/agents/templates/version_control.json +4 -2
  22. claude_mpm/agents/templates/web_qa.json +2 -1
  23. claude_mpm/cli/README.md +253 -0
  24. claude_mpm/cli/__init__.py +11 -1
  25. claude_mpm/cli/commands/aggregate.py +1 -1
  26. claude_mpm/cli/commands/analyze.py +3 -3
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  29. claude_mpm/cli/commands/debug.py +12 -12
  30. claude_mpm/cli/commands/hook_errors.py +277 -0
  31. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  32. claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
  33. claude_mpm/cli/commands/mpm_init/README.md +365 -0
  34. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  35. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  36. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  37. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  38. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  39. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  40. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  41. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  42. claude_mpm/cli/commands/run.py +124 -128
  43. claude_mpm/cli/commands/skills.py +522 -34
  44. claude_mpm/cli/executor.py +56 -0
  45. claude_mpm/cli/interactive/agent_wizard.py +5 -5
  46. claude_mpm/cli/parsers/base_parser.py +28 -0
  47. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  48. claude_mpm/cli/parsers/skills_parser.py +138 -0
  49. claude_mpm/cli/startup.py +111 -8
  50. claude_mpm/cli/startup_display.py +480 -0
  51. claude_mpm/cli/utils.py +1 -1
  52. claude_mpm/cli_module/commands.py +1 -1
  53. claude_mpm/cli_module/refactoring_guide.md +253 -0
  54. claude_mpm/commands/mpm-help.md +3 -0
  55. claude_mpm/commands/mpm-init.md +19 -3
  56. claude_mpm/commands/mpm-resume.md +372 -0
  57. claude_mpm/commands/mpm-tickets.md +56 -7
  58. claude_mpm/commands/mpm.md +1 -0
  59. claude_mpm/config/agent_capabilities.yaml +658 -0
  60. claude_mpm/config/async_logging_config.yaml +145 -0
  61. claude_mpm/constants.py +12 -0
  62. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
  63. claude_mpm/core/api_validator.py +1 -1
  64. claude_mpm/core/claude_runner.py +14 -1
  65. claude_mpm/core/config.py +8 -0
  66. claude_mpm/core/constants.py +1 -1
  67. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  68. claude_mpm/core/hook_error_memory.py +381 -0
  69. claude_mpm/core/hook_manager.py +41 -2
  70. claude_mpm/core/interactive_session.py +48 -3
  71. claude_mpm/core/interfaces.py +56 -1
  72. claude_mpm/core/logger.py +3 -1
  73. claude_mpm/core/oneshot_session.py +39 -0
  74. claude_mpm/d2/.gitignore +22 -0
  75. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
  76. claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
  77. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
  78. claude_mpm/d2/QUICKSTART.md +186 -0
  79. claude_mpm/d2/README.md +232 -0
  80. claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
  81. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
  82. claude_mpm/d2/TESTING.md +288 -0
  83. claude_mpm/d2/index.html +118 -0
  84. claude_mpm/d2/package.json +19 -0
  85. claude_mpm/d2/src/App.svelte +110 -0
  86. claude_mpm/d2/src/components/Header.svelte +153 -0
  87. claude_mpm/d2/src/components/MainContent.svelte +74 -0
  88. claude_mpm/d2/src/components/Sidebar.svelte +85 -0
  89. claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
  90. claude_mpm/d2/src/lib/socketio.js +144 -0
  91. claude_mpm/d2/src/main.js +7 -0
  92. claude_mpm/d2/src/stores/events.js +114 -0
  93. claude_mpm/d2/src/stores/socket.js +108 -0
  94. claude_mpm/d2/src/stores/theme.js +65 -0
  95. claude_mpm/d2/svelte.config.js +12 -0
  96. claude_mpm/d2/vite.config.js +15 -0
  97. claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
  98. claude_mpm/dashboard/BUILD_NUMBER +1 -0
  99. claude_mpm/dashboard/README.md +121 -0
  100. claude_mpm/dashboard/VERSION +1 -0
  101. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
  102. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
  103. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
  104. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
  105. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
  106. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
  107. claude_mpm/dashboard/react/entries/events.tsx +165 -0
  108. claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
  109. claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
  110. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
  111. claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
  112. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
  114. claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
  117. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
  118. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
  119. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
  120. claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
  121. claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
  122. claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
  123. claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
  124. claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
  125. claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
  126. claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
  127. claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
  128. claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
  129. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
  130. claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
  131. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
  132. claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
  133. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
  134. claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
  135. claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
  136. claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
  137. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
  138. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
  139. claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
  140. claude_mpm/dashboard/static/built/connection-manager.js +76 -76
  141. claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
  142. claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
  143. claude_mpm/dashboard/static/built/react/events.js.map +1 -0
  144. claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
  145. claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
  146. claude_mpm/dashboard/static/built/shared/logger.js +16 -16
  147. claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
  148. claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
  149. claude_mpm/dashboard/static/css/activity.css +69 -69
  150. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  151. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  152. claude_mpm/dashboard/static/index.html +22 -22
  153. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
  154. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  155. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  156. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  157. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  158. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  159. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  160. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  161. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  162. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  163. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  164. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  165. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  166. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  167. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  168. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  169. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  170. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  171. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  172. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  173. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  174. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  175. claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
  176. claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
  177. claude_mpm/dashboard/static/js/shared/logger.js +16 -16
  178. claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
  179. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  180. claude_mpm/dashboard/static/navigation-test-results.md +118 -0
  181. claude_mpm/dashboard/static/production/main.html +21 -21
  182. claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
  183. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
  184. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
  185. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
  186. claude_mpm/dashboard/templates/code_simple.html +23 -23
  187. claude_mpm/dashboard/templates/index.html +18 -18
  188. claude_mpm/hooks/README.md +143 -0
  189. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  190. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  191. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  192. claude_mpm/hooks/templates/README.md +180 -0
  193. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  194. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  195. claude_mpm/hooks/templates/settings.json.example +147 -0
  196. claude_mpm/schemas/agent_schema.json +596 -0
  197. claude_mpm/schemas/frontmatter_schema.json +165 -0
  198. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  199. claude_mpm/scripts/start_activity_logging.py +3 -1
  200. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  201. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  202. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  203. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  204. claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
  205. claude_mpm/services/agents/local_template_manager.py +3 -1
  206. claude_mpm/services/cli/session_pause_manager.py +504 -0
  207. claude_mpm/services/cli/session_resume_helper.py +36 -16
  208. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  209. claude_mpm/services/core/base.py +26 -11
  210. claude_mpm/services/core/interfaces.py +56 -1
  211. claude_mpm/services/core/models/agent_config.py +3 -0
  212. claude_mpm/services/core/models/process.py +4 -0
  213. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  214. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  215. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  216. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  217. claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
  218. claude_mpm/services/diagnostics/models.py +21 -0
  219. claude_mpm/services/event_bus/README.md +244 -0
  220. claude_mpm/services/event_bus/direct_relay.py +3 -3
  221. claude_mpm/services/event_bus/event_bus.py +36 -3
  222. claude_mpm/services/event_bus/relay.py +23 -7
  223. claude_mpm/services/events/README.md +303 -0
  224. claude_mpm/services/events/consumers/logging.py +1 -2
  225. claude_mpm/services/framework_claude_md_generator/README.md +119 -0
  226. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  227. claude_mpm/services/local_ops/__init__.py +2 -0
  228. claude_mpm/services/local_ops/process_manager.py +1 -1
  229. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  230. claude_mpm/services/mcp_gateway/README.md +185 -0
  231. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  232. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  233. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  235. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  236. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  237. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  238. claude_mpm/services/memory/failure_tracker.py +19 -4
  239. claude_mpm/services/memory/optimizer.py +1 -1
  240. claude_mpm/services/model/model_router.py +8 -9
  241. claude_mpm/services/monitor/daemon.py +1 -1
  242. claude_mpm/services/monitor/server.py +2 -2
  243. claude_mpm/services/native_agent_converter.py +356 -0
  244. claude_mpm/services/port_manager.py +1 -1
  245. claude_mpm/services/project/documentation_manager.py +2 -1
  246. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  247. claude_mpm/services/runner_configuration_service.py +1 -0
  248. claude_mpm/services/self_upgrade_service.py +165 -7
  249. claude_mpm/services/skills_config.py +547 -0
  250. claude_mpm/services/skills_deployer.py +955 -0
  251. claude_mpm/services/socketio/handlers/connection.py +1 -1
  252. claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
  253. claude_mpm/services/socketio/handlers/git.py +2 -2
  254. claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
  255. claude_mpm/services/static/.gitkeep +2 -0
  256. claude_mpm/services/system_instructions_service.py +1 -3
  257. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  258. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  259. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  260. claude_mpm/services/version_control/VERSION +1 -0
  261. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  262. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  263. claude_mpm/skills/__init__.py +3 -3
  264. claude_mpm/skills/agent_skills_injector.py +42 -49
  265. claude_mpm/skills/bundled/.gitkeep +2 -0
  266. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
  267. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
  268. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  269. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  270. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  271. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  272. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  273. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +46 -41
  274. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  275. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  276. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +36 -73
  277. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  278. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  279. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +100 -125
  280. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
  281. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  282. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  283. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  284. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  285. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +28 -72
  286. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -0
  287. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  288. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  289. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +272 -0
  290. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  291. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  292. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  293. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  294. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  295. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  296. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  297. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  298. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  299. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  300. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
  301. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
  302. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  303. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
  304. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  305. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
  306. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +11 -0
  307. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
  308. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
  309. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  310. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  311. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  312. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  313. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
  314. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
  315. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
  316. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +135 -155
  317. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  318. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  319. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  320. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  321. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  322. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  323. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  324. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  325. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  326. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  327. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  328. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  329. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  330. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  331. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  332. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  333. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  334. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  335. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  336. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  337. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  338. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  339. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  340. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  341. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  342. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  343. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  344. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  345. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  346. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  347. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  348. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  349. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  350. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  351. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  352. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +21 -25
  353. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
  354. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  355. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  356. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  357. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  358. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  359. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  360. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +86 -250
  361. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  362. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  363. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  364. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  365. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
  366. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +145 -57
  367. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  368. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  369. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  370. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  371. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  372. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  373. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  374. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  375. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  376. claude_mpm/skills/skills_registry.py +44 -48
  377. claude_mpm/skills/skills_service.py +117 -108
  378. claude_mpm/templates/questions/EXAMPLES.md +501 -0
  379. claude_mpm/templates/questions/__init__.py +43 -0
  380. claude_mpm/templates/questions/base.py +193 -0
  381. claude_mpm/templates/questions/pr_strategy.py +314 -0
  382. claude_mpm/templates/questions/project_init.py +388 -0
  383. claude_mpm/templates/questions/ticket_mgmt.py +397 -0
  384. claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
  385. claude_mpm/tools/__main__.py +8 -8
  386. claude_mpm/tools/code_tree_analyzer/README.md +64 -0
  387. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  388. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  389. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  390. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  391. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  392. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  393. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  394. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  395. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  396. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  397. claude_mpm/utils/agent_dependency_loader.py +3 -3
  398. claude_mpm/utils/dependency_cache.py +3 -1
  399. claude_mpm/utils/gitignore.py +241 -0
  400. claude_mpm/utils/log_cleanup.py +3 -3
  401. claude_mpm/utils/robust_installer.py +3 -5
  402. claude_mpm/utils/structured_questions.py +619 -0
  403. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
  404. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
  405. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  406. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  407. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  408. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  409. claude_mpm/cli/commands/mpm_init.py +0 -2093
  410. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  411. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  412. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  413. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  414. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  415. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  416. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  417. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  418. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  419. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  420. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  421. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  422. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  423. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  424. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  425. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  426. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  444. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  445. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  446. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  447. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  448. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  449. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  450. /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
  451. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
  452. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
  453. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
  454. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
@@ -539,7 +539,7 @@ class ConnectionEventHandler(BaseEventHandler):
539
539
  if data and "timestamp" in data:
540
540
  rtt = current_time - data["timestamp"]
541
541
  if rtt < 10: # Reasonable RTT
542
- self.logger.debug(f"🏓 Pong from {sid}, RTT: {rtt*1000:.1f}ms")
542
+ self.logger.debug(f"🏓 Pong from {sid}, RTT: {rtt * 1000:.1f}ms")
543
543
 
544
544
  def _normalize_event(self, event_data: Dict[str, Any]) -> Dict[str, Any]:
545
545
  """Normalize event format to ensure consistency.
@@ -0,0 +1,217 @@
1
+ """Connection event handlers for Socket.IO.
2
+
3
+ WHY: This module handles all connection-related events including connect,
4
+ disconnect, status requests, and history management. Separating these
5
+ from other handlers makes connection management more maintainable.
6
+ """
7
+
8
+ from datetime import datetime
9
+ from typing import Any, Dict, List, Optional, Set
10
+
11
+ from ....core.typing_utils import ClaudeStatus, EventData, SocketId
12
+ from .base import BaseEventHandler
13
+
14
+
15
+ class ConnectionEventHandler(BaseEventHandler):
16
+ """Handles Socket.IO connection lifecycle events.
17
+
18
+ WHY: Connection management is a critical aspect of the Socket.IO server
19
+ that deserves its own focused handler. This includes client connections,
20
+ disconnections, status updates, and event history management.
21
+ """
22
+
23
+ def register_events(self) -> None:
24
+ """Register connection-related event handlers."""
25
+
26
+ @self.sio.event
27
+ async def connect(sid, environ, *args):
28
+ """Handle client connection.
29
+
30
+ WHY: When a client connects, we need to track them, send initial
31
+ status information, and provide recent event history so they have
32
+ context for what's happening in the session.
33
+ """
34
+ self.clients.add(sid)
35
+ client_addr = environ.get("REMOTE_ADDR", "unknown")
36
+ user_agent = environ.get("HTTP_USER_AGENT", "unknown")
37
+ self.logger.info(f"🔗 NEW CLIENT CONNECTED: {sid} from {client_addr}")
38
+ self.logger.info(f"📱 User Agent: {user_agent[:100]}...")
39
+ self.logger.info(f"📈 Total clients now: {len(self.clients)}")
40
+
41
+ # Send initial status immediately with enhanced data
42
+ status_data = {
43
+ "server": "claude-mpm-python-socketio",
44
+ "timestamp": datetime.utcnow().isoformat() + "Z",
45
+ "clients_connected": len(self.clients),
46
+ "session_id": self.server.session_id,
47
+ "claude_status": self.server.claude_status,
48
+ "claude_pid": self.server.claude_pid,
49
+ "server_version": "2.0.0",
50
+ "client_id": sid,
51
+ }
52
+
53
+ try:
54
+ await self.emit_to_client(sid, "status", status_data)
55
+ await self.emit_to_client(
56
+ sid,
57
+ "welcome",
58
+ {
59
+ "message": "Connected to Claude MPM Socket.IO server",
60
+ "client_id": sid,
61
+ "server_time": datetime.utcnow().isoformat() + "Z",
62
+ },
63
+ )
64
+
65
+ # Automatically send the last 50 events to new clients
66
+ await self._send_event_history(sid, limit=50)
67
+
68
+ self.logger.debug(
69
+ f"✅ Sent welcome messages and event history to client {sid}"
70
+ )
71
+ except Exception as e:
72
+ self.log_error(f"sending welcome to client {sid}", e)
73
+
74
+ @self.sio.event
75
+ async def disconnect(sid):
76
+ """Handle client disconnection.
77
+
78
+ WHY: We need to clean up client tracking when they disconnect
79
+ to maintain accurate connection counts and avoid memory leaks.
80
+ """
81
+ if sid in self.clients:
82
+ self.clients.remove(sid)
83
+ self.logger.info(f"🔌 CLIENT DISCONNECTED: {sid}")
84
+ self.logger.info(f"📉 Total clients now: {len(self.clients)}")
85
+ else:
86
+ self.logger.warning(
87
+ f"⚠️ Attempted to disconnect unknown client: {sid}"
88
+ )
89
+
90
+ @self.sio.event
91
+ async def get_status(sid):
92
+ """Handle status request.
93
+
94
+ WHY: Clients need to query current server status on demand
95
+ to update their UI or verify connection health.
96
+ """
97
+ status_data = {
98
+ "server": "claude-mpm-python-socketio",
99
+ "timestamp": datetime.utcnow().isoformat() + "Z",
100
+ "clients_connected": len(self.clients),
101
+ "session_id": self.server.session_id,
102
+ "claude_status": self.server.claude_status,
103
+ "claude_pid": self.server.claude_pid,
104
+ }
105
+ await self.emit_to_client(sid, "status", status_data)
106
+
107
+ @self.sio.event
108
+ async def get_history(sid, data=None):
109
+ """Handle history request.
110
+
111
+ WHY: Clients may need to request specific event history
112
+ to reconstruct state or filter by event types.
113
+ """
114
+ params = data or {}
115
+ event_types = params.get("event_types", [])
116
+ limit = min(params.get("limit", 100), len(self.event_history))
117
+
118
+ await self._send_event_history(sid, event_types=event_types, limit=limit)
119
+
120
+ @self.sio.event
121
+ async def request_history(sid, data=None):
122
+ """Handle legacy history request (for client compatibility).
123
+
124
+ WHY: Maintains backward compatibility with clients using
125
+ the older 'request.history' event name.
126
+ """
127
+ params = data or {}
128
+ event_types = params.get("event_types", [])
129
+ limit = min(params.get("limit", 50), len(self.event_history))
130
+
131
+ await self._send_event_history(sid, event_types=event_types, limit=limit)
132
+
133
+ @self.sio.event
134
+ async def subscribe(sid, data=None):
135
+ """Handle subscription request.
136
+
137
+ WHY: Allows clients to subscribe to specific event channels
138
+ for filtered event streaming.
139
+ """
140
+ channels = data.get("channels", ["*"]) if data else ["*"]
141
+ await self.emit_to_client(sid, "subscribed", {"channels": channels})
142
+
143
+ @self.sio.event
144
+ async def claude_event(sid, data):
145
+ """Handle events from client proxies.
146
+
147
+ WHY: Client proxies send events that need to be stored
148
+ in history and re-broadcast to other clients.
149
+ """
150
+ # Store in history
151
+ self.event_history.append(data)
152
+ self.logger.debug(
153
+ f"📚 Event from client stored in history (total: {len(self.event_history)})"
154
+ )
155
+
156
+ # Re-broadcast to all other clients
157
+ await self.broadcast_event("claude_event", data, skip_sid=sid)
158
+
159
+ async def _send_event_history(
160
+ self, sid: str, event_types: Optional[List[str]] = None, limit: int = 50
161
+ ):
162
+ """Send event history to a specific client.
163
+
164
+ WHY: When clients connect to the dashboard, they need context from recent events
165
+ to understand what's been happening. This sends the most recent events in
166
+ chronological order (oldest first) so the dashboard displays them properly.
167
+
168
+ Args:
169
+ sid: Socket.IO session ID of the client
170
+ event_types: Optional list of event types to filter by
171
+ limit: Maximum number of events to send (default: 50)
172
+ """
173
+ try:
174
+ if not self.event_history:
175
+ self.logger.debug(f"No event history to send to client {sid}")
176
+ return
177
+
178
+ # Limit to reasonable number to avoid overwhelming client
179
+ limit = min(limit, 100)
180
+
181
+ # Get the most recent events, filtered by type if specified
182
+ history = []
183
+ for event in reversed(self.event_history):
184
+ if not event_types or event.get("type") in event_types:
185
+ history.append(event)
186
+ if len(history) >= limit:
187
+ break
188
+
189
+ # Reverse to get chronological order (oldest first)
190
+ history = list(reversed(history))
191
+
192
+ if history:
193
+ # Send as 'history' event that the client expects
194
+ await self.emit_to_client(
195
+ sid,
196
+ "history",
197
+ {
198
+ "events": history,
199
+ "count": len(history),
200
+ "total_available": len(self.event_history),
201
+ },
202
+ )
203
+
204
+ self.logger.info(
205
+ f"📚 Sent {len(history)} historical events to client {sid}"
206
+ )
207
+ else:
208
+ self.logger.debug(
209
+ f"No matching events found for client {sid} with filters: {event_types}"
210
+ )
211
+
212
+ except Exception as e:
213
+ self.log_error(
214
+ f"sending event history to client {sid}",
215
+ e,
216
+ {"event_types": event_types, "limit": limit},
217
+ )
@@ -745,7 +745,7 @@ class GitEventHandler(BaseEventHandler):
745
745
  stdout=asyncio.subprocess.PIPE,
746
746
  stderr=asyncio.subprocess.PIPE,
747
747
  )
748
- diff_output, diff_error = await diff_proc.communicate()
748
+ diff_output, _ = await diff_proc.communicate()
749
749
 
750
750
  if diff_proc.returncode == 0:
751
751
  return {
@@ -792,7 +792,7 @@ class GitEventHandler(BaseEventHandler):
792
792
  stdout=asyncio.subprocess.PIPE,
793
793
  stderr=asyncio.subprocess.PIPE,
794
794
  )
795
- diff_output, diff_error = await diff_proc.communicate()
795
+ diff_output, _diff_error = await diff_proc.communicate()
796
796
 
797
797
  if diff_proc.returncode == 0:
798
798
  return {
@@ -0,0 +1,154 @@
1
+ """Hook event handlers for Socket.IO.
2
+
3
+ WHY: This module handles hook events from Claude to track session information,
4
+ agent delegations, and other hook-based activity for the system heartbeat.
5
+ """
6
+
7
+ from datetime import datetime
8
+ from typing import Any, Dict, Optional
9
+
10
+ from .base import BaseEventHandler
11
+
12
+
13
+ class HookEventHandler(BaseEventHandler):
14
+ """Handles hook events from Claude for session tracking.
15
+
16
+ WHY: Hook events provide rich information about Claude's activity including
17
+ session starts/stops, agent delegations, and tool usage. This handler
18
+ extracts session information to populate the system heartbeat data.
19
+ """
20
+
21
+ def register_events(self) -> None:
22
+ """Register hook event handlers."""
23
+
24
+ @self.sio.event
25
+ async def claude_event(sid, data):
26
+ """Handle claude_event which includes hook events.
27
+
28
+ WHY: Hook events are sent as claude_event with type 'hook'
29
+ and contain session and agent delegation information.
30
+ """
31
+ if not isinstance(data, dict):
32
+ return
33
+
34
+ # Check if this is a hook event
35
+ event_type = data.get("type")
36
+ if event_type != "hook":
37
+ return
38
+
39
+ # Extract hook event details
40
+ hook_event = data.get("event")
41
+ hook_data = data.get("data", {})
42
+
43
+ # Track sessions based on hook events
44
+ if hook_event == "subagent_start":
45
+ await self._handle_subagent_start(hook_data)
46
+ elif hook_event == "subagent_stop":
47
+ await self._handle_subagent_stop(hook_data)
48
+ elif hook_event == "user_prompt":
49
+ await self._handle_user_prompt(hook_data)
50
+ elif hook_event == "pre_tool":
51
+ await self._handle_pre_tool(hook_data)
52
+
53
+ async def _handle_subagent_start(self, data: Dict[str, Any]):
54
+ """Handle subagent start events.
55
+
56
+ WHY: When a subagent starts, we track it as an active session
57
+ with the agent type and start time for the heartbeat.
58
+ """
59
+ session_id = data.get("session_id")
60
+ agent_type = data.get("agent_type", "unknown")
61
+
62
+ if not session_id:
63
+ return
64
+
65
+ # Update or create session tracking
66
+ if hasattr(self.server, 'active_sessions'):
67
+ self.server.active_sessions[session_id] = {
68
+ "session_id": session_id,
69
+ "start_time": datetime.now().isoformat(),
70
+ "agent": agent_type,
71
+ "status": "active",
72
+ "prompt": data.get("prompt", "")[:100], # First 100 chars
73
+ "last_activity": datetime.now().isoformat(),
74
+ }
75
+
76
+ self.logger.debug(
77
+ f"Tracked subagent start: session={session_id[:8]}..., agent={agent_type}"
78
+ )
79
+
80
+ async def _handle_subagent_stop(self, data: Dict[str, Any]):
81
+ """Handle subagent stop events.
82
+
83
+ WHY: When a subagent stops, we update its status or remove it
84
+ from active sessions depending on the stop reason.
85
+ """
86
+ session_id = data.get("session_id")
87
+
88
+ if not session_id:
89
+ return
90
+
91
+ # Update session status
92
+ if hasattr(self.server, 'active_sessions'):
93
+ if session_id in self.server.active_sessions:
94
+ # Mark as completed rather than removing immediately
95
+ self.server.active_sessions[session_id]["status"] = "completed"
96
+ self.server.active_sessions[session_id]["last_activity"] = datetime.now().isoformat()
97
+
98
+ self.logger.debug(
99
+ f"Marked session completed: session={session_id[:8]}..."
100
+ )
101
+
102
+ async def _handle_user_prompt(self, data: Dict[str, Any]):
103
+ """Handle user prompt events.
104
+
105
+ WHY: User prompts indicate the start of a new interaction,
106
+ which we track as a PM session if no delegation occurs.
107
+ """
108
+ session_id = data.get("session_id")
109
+
110
+ if not session_id:
111
+ return
112
+
113
+ # Create or update PM session
114
+ if hasattr(self.server, 'active_sessions'):
115
+ if session_id not in self.server.active_sessions:
116
+ self.server.active_sessions[session_id] = {
117
+ "session_id": session_id,
118
+ "start_time": datetime.now().isoformat(),
119
+ "agent": "pm", # Default to PM
120
+ "status": "active",
121
+ "prompt": data.get("prompt_text", "")[:100],
122
+ "working_directory": data.get("working_directory", ""),
123
+ "last_activity": datetime.now().isoformat(),
124
+ }
125
+ else:
126
+ # Update last activity
127
+ self.server.active_sessions[session_id]["last_activity"] = datetime.now().isoformat()
128
+
129
+ async def _handle_pre_tool(self, data: Dict[str, Any]):
130
+ """Handle pre-tool events.
131
+
132
+ WHY: Pre-tool events with Task delegation indicate agent changes
133
+ that we need to track for accurate session information.
134
+ """
135
+ if data.get("tool_name") != "Task":
136
+ return
137
+
138
+ session_id = data.get("session_id")
139
+ delegation_details = data.get("delegation_details", {})
140
+ agent_type = delegation_details.get("agent_type", "unknown")
141
+
142
+ if not session_id:
143
+ return
144
+
145
+ # Update session with new agent
146
+ if hasattr(self.server, 'active_sessions'):
147
+ if session_id in self.server.active_sessions:
148
+ self.server.active_sessions[session_id]["agent"] = agent_type
149
+ self.server.active_sessions[session_id]["status"] = "delegated"
150
+ self.server.active_sessions[session_id]["last_activity"] = datetime.now().isoformat()
151
+
152
+ self.logger.debug(
153
+ f"Updated session delegation: session={session_id[:8]}..., agent={agent_type}"
154
+ )
@@ -0,0 +1,2 @@
1
+ # Static files directory for SocketIO service
2
+ # This directory is created to prevent FileNotFoundError when the SocketIO service starts
@@ -112,9 +112,7 @@ class SystemInstructionsService(BaseService, SystemInstructionsInterface):
112
112
  self.agent_capabilities_service
113
113
  and "{{AGENT_CAPABILITIES}}" in base_pm_content
114
114
  ):
115
- capabilities = (
116
- self.agent_capabilities_service.generate_deployed_agent_capabilities()
117
- )
115
+ capabilities = self.agent_capabilities_service.generate_deployed_agent_capabilities()
118
116
  base_pm_content = base_pm_content.replace(
119
117
  "{{AGENT_CAPABILITIES}}", capabilities
120
118
  )
@@ -527,13 +527,11 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
527
527
  and node.iter.func.id == "range"
528
528
  and len(node.iter.args) == 1
529
529
  ):
530
-
531
530
  if isinstance(node.iter.args[0], ast.Call):
532
531
  if (
533
532
  isinstance(node.iter.args[0].func, ast.Name)
534
533
  and node.iter.args[0].func.id == "len"
535
534
  ):
536
-
537
535
  results["optimizations"].append(
538
536
  {
539
537
  "type": "range_len_pattern",
@@ -562,7 +560,6 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
562
560
  "min",
563
561
  "max",
564
562
  ]:
565
-
566
563
  results["optimizations"].append(
567
564
  {
568
565
  "type": "generator_opportunity",
@@ -436,7 +436,6 @@ class SecurityAnalyzerStrategy(AnalyzerStrategy):
436
436
  and node.func.value.id == "subprocess"
437
437
  and node.func.attr in ["run", "call", "Popen"]
438
438
  ):
439
-
440
439
  for keyword in node.keywords:
441
440
  if (
442
441
  keyword.arg == "shell"
@@ -64,7 +64,7 @@ class RailwayDeploymentStrategy(DeploymentStrategy):
64
64
 
65
65
  def prepare(self, context: DeploymentContext) -> List[Path]:
66
66
  """Prepare Railway artifacts."""
67
- artifact_path, metadata = prepare_deployment_artifact(
67
+ artifact_path, _metadata = prepare_deployment_artifact(
68
68
  context.source, "directory", context.config
69
69
  )
70
70
  return [artifact_path]
@@ -0,0 +1 @@
1
+ 0.9.0
@@ -458,17 +458,19 @@ class ConflictResolutionManager:
458
458
 
459
459
  for i, marker in enumerate(markers):
460
460
  if not marker.ours_content and marker.theirs_content:
461
- suggestions.append(f"Conflict {i+1}: Accept incoming changes (theirs)")
461
+ suggestions.append(
462
+ f"Conflict {i + 1}: Accept incoming changes (theirs)"
463
+ )
462
464
  elif marker.ours_content and not marker.theirs_content:
463
- suggestions.append(f"Conflict {i+1}: Keep current changes (ours)")
465
+ suggestions.append(f"Conflict {i + 1}: Keep current changes (ours)")
464
466
  elif self._only_whitespace_differences(
465
467
  marker.ours_content, marker.theirs_content
466
468
  ):
467
469
  suggestions.append(
468
- f"Conflict {i+1}: Whitespace differences only - can auto-resolve"
470
+ f"Conflict {i + 1}: Whitespace differences only - can auto-resolve"
469
471
  )
470
472
  else:
471
- suggestions.append(f"Conflict {i+1}: Manual merge required")
473
+ suggestions.append(f"Conflict {i + 1}: Manual merge required")
472
474
 
473
475
  return "; ".join(suggestions)
474
476
 
@@ -307,9 +307,8 @@ class MermaidGeneratorService(SyncBaseService):
307
307
  import_from = imp.get("from", imp.get("module", ""))
308
308
  if import_from:
309
309
  import_name = self._extract_module_name(import_from)
310
- if (
311
- not config.include_external
312
- and self._is_external_module(import_name)
310
+ if not config.include_external and self._is_external_module(
311
+ import_name
313
312
  ):
314
313
  continue
315
314
  modules.add(import_name)
@@ -30,13 +30,13 @@ from .skills_registry import SkillsRegistry as SkillsRegistryHelper
30
30
  from .skills_service import SkillsService
31
31
 
32
32
  __all__ = [
33
- # New Skills Integration System
34
- "SkillsService",
35
33
  "AgentSkillsInjector",
36
- "SkillsRegistryHelper",
37
34
  # Legacy System
38
35
  "Skill",
39
36
  "SkillManager",
40
37
  "SkillsRegistry",
38
+ "SkillsRegistryHelper",
39
+ # New Skills Integration System
40
+ "SkillsService",
41
41
  "get_registry",
42
42
  ]