claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__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 (623) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +4 -0
  3. claude_mpm/agents/BASE_AGENT.md +164 -0
  4. claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
  5. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  6. claude_mpm/agents/MEMORY.md +1 -1
  7. claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
  8. claude_mpm/agents/WORKFLOW.md +5 -254
  9. claude_mpm/agents/__init__.py +6 -0
  10. claude_mpm/agents/agent_loader.py +14 -48
  11. claude_mpm/agents/base_agent.json +7 -4
  12. claude_mpm/agents/frontmatter_validator.py +71 -3
  13. claude_mpm/agents/templates/circuit-breakers.md +1391 -0
  14. claude_mpm/agents/templates/context-management-examples.md +544 -0
  15. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  16. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  17. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  18. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  19. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  20. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  21. claude_mpm/cli/__init__.py +37 -2
  22. claude_mpm/cli/__main__.py +4 -0
  23. claude_mpm/cli/chrome_devtools_installer.py +175 -0
  24. claude_mpm/cli/commands/__init__.py +2 -0
  25. claude_mpm/cli/commands/agent_source.py +774 -0
  26. claude_mpm/cli/commands/agent_state_manager.py +180 -31
  27. claude_mpm/cli/commands/agents.py +1116 -55
  28. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  29. claude_mpm/cli/commands/agents_discover.py +338 -0
  30. claude_mpm/cli/commands/aggregate.py +1 -1
  31. claude_mpm/cli/commands/analyze.py +3 -3
  32. claude_mpm/cli/commands/auto_configure.py +725 -242
  33. claude_mpm/cli/commands/config.py +95 -6
  34. claude_mpm/cli/commands/configure.py +1875 -46
  35. claude_mpm/cli/commands/configure_agent_display.py +29 -10
  36. claude_mpm/cli/commands/configure_navigation.py +63 -46
  37. claude_mpm/cli/commands/debug.py +12 -12
  38. claude_mpm/cli/commands/doctor.py +10 -2
  39. claude_mpm/cli/commands/hook_errors.py +277 -0
  40. claude_mpm/cli/commands/local_deploy.py +1 -4
  41. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  42. claude_mpm/cli/commands/mpm_init/core.py +229 -2
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  44. claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
  46. claude_mpm/cli/commands/postmortem.py +401 -0
  47. claude_mpm/cli/commands/profile.py +277 -0
  48. claude_mpm/cli/commands/run.py +123 -165
  49. claude_mpm/cli/commands/skill_source.py +694 -0
  50. claude_mpm/cli/commands/skills.py +782 -20
  51. claude_mpm/cli/commands/summarize.py +413 -0
  52. claude_mpm/cli/executor.py +96 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1030 -45
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +307 -10
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
  57. claude_mpm/cli/parsers/base_parser.py +65 -0
  58. claude_mpm/cli/parsers/config_parser.py +162 -39
  59. claude_mpm/cli/parsers/profile_parser.py +148 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +146 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +1280 -118
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/mpm-config.md +21 -134
  68. claude_mpm/commands/mpm-doctor.md +16 -20
  69. claude_mpm/commands/mpm-help.md +13 -283
  70. claude_mpm/commands/mpm-init.md +88 -489
  71. claude_mpm/commands/mpm-monitor.md +23 -401
  72. claude_mpm/commands/mpm-organize.md +72 -247
  73. claude_mpm/commands/mpm-postmortem.md +21 -0
  74. claude_mpm/commands/mpm-session-resume.md +30 -0
  75. claude_mpm/commands/mpm-status.md +13 -68
  76. claude_mpm/commands/mpm-ticket-view.md +109 -0
  77. claude_mpm/commands/mpm-version.md +13 -106
  78. claude_mpm/commands/mpm.md +10 -0
  79. claude_mpm/config/agent_presets.py +488 -0
  80. claude_mpm/config/agent_sources.py +352 -0
  81. claude_mpm/config/skill_presets.py +392 -0
  82. claude_mpm/config/skill_sources.py +590 -0
  83. claude_mpm/constants.py +13 -0
  84. claude_mpm/core/claude_runner.py +5 -34
  85. claude_mpm/core/config.py +15 -1
  86. claude_mpm/core/constants.py +1 -1
  87. claude_mpm/core/framework/__init__.py +3 -16
  88. claude_mpm/core/framework/formatters/content_formatter.py +3 -13
  89. claude_mpm/core/framework/loaders/agent_loader.py +8 -5
  90. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  91. claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
  92. claude_mpm/core/framework_loader.py +4 -2
  93. claude_mpm/core/hook_error_memory.py +381 -0
  94. claude_mpm/core/hook_manager.py +41 -2
  95. claude_mpm/core/interactive_session.py +91 -10
  96. claude_mpm/core/logger.py +16 -1
  97. claude_mpm/core/oneshot_session.py +71 -8
  98. claude_mpm/core/optimized_startup.py +59 -0
  99. claude_mpm/core/output_style_manager.py +173 -43
  100. claude_mpm/core/protocols/__init__.py +23 -0
  101. claude_mpm/core/protocols/runner_protocol.py +103 -0
  102. claude_mpm/core/protocols/session_protocol.py +131 -0
  103. claude_mpm/core/shared/config_loader.py +1 -1
  104. claude_mpm/core/shared/singleton_manager.py +11 -4
  105. claude_mpm/core/socketio_pool.py +3 -3
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_agent_registry.py +134 -16
  108. claude_mpm/core/unified_config.py +22 -0
  109. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  110. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
  111. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
  112. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
  113. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
  114. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
  115. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
  116. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
  117. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
  118. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
  119. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
  120. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
  121. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
  122. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
  123. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
  124. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  125. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  126. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  127. claude_mpm/experimental/cli_enhancements.py +1 -5
  128. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  131. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  136. claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
  137. claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
  138. claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
  139. claude_mpm/hooks/claude_hooks/installer.py +33 -10
  140. claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
  141. claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
  142. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  143. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  144. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  145. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
  149. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  150. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  151. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  152. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  153. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  154. claude_mpm/hooks/memory_integration_hook.py +46 -1
  155. claude_mpm/init.py +63 -19
  156. claude_mpm/models/agent_definition.py +7 -0
  157. claude_mpm/models/git_repository.py +198 -0
  158. claude_mpm/scripts/claude-hook-handler.sh +60 -20
  159. claude_mpm/scripts/launch_monitor.py +93 -13
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +48 -12
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_recommendation_service.py +278 -0
  164. claude_mpm/services/agents/agent_review_service.py +280 -0
  165. claude_mpm/services/agents/agent_selection_service.py +484 -0
  166. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  167. claude_mpm/services/agents/cache_git_manager.py +621 -0
  168. claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
  169. claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
  170. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  171. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  172. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  174. claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
  175. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  176. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  177. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  178. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
  179. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  180. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  181. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
  182. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  183. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  184. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  185. claude_mpm/services/agents/git_source_manager.py +663 -0
  186. claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
  187. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  188. claude_mpm/services/agents/local_template_manager.py +50 -10
  189. claude_mpm/services/agents/recommender.py +5 -3
  190. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  191. claude_mpm/services/agents/sources/__init__.py +13 -0
  192. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  193. claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
  194. claude_mpm/services/agents/startup_sync.py +259 -0
  195. claude_mpm/services/agents/toolchain_detector.py +478 -0
  196. claude_mpm/services/analysis/__init__.py +35 -0
  197. claude_mpm/services/analysis/clone_detector.py +1030 -0
  198. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  199. claude_mpm/services/analysis/postmortem_service.py +765 -0
  200. claude_mpm/services/cli/session_pause_manager.py +1 -1
  201. claude_mpm/services/command_deployment_service.py +271 -6
  202. claude_mpm/services/core/base.py +7 -2
  203. claude_mpm/services/core/interfaces/__init__.py +1 -3
  204. claude_mpm/services/core/interfaces/health.py +1 -4
  205. claude_mpm/services/core/models/__init__.py +2 -11
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/event_bus/config.py +3 -1
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/events/consumers/logging.py +1 -2
  219. claude_mpm/services/git/__init__.py +21 -0
  220. claude_mpm/services/git/git_operations_service.py +579 -0
  221. claude_mpm/services/github/__init__.py +21 -0
  222. claude_mpm/services/github/github_cli_service.py +397 -0
  223. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  224. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  225. claude_mpm/services/instructions/__init__.py +9 -0
  226. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  227. claude_mpm/services/local_ops/__init__.py +3 -13
  228. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  229. claude_mpm/services/local_ops/health_manager.py +1 -4
  230. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  231. claude_mpm/services/mcp_config_manager.py +75 -145
  232. claude_mpm/services/mcp_service_verifier.py +6 -3
  233. claude_mpm/services/model/model_router.py +1 -2
  234. claude_mpm/services/monitor/daemon.py +38 -11
  235. claude_mpm/services/monitor/daemon_manager.py +134 -21
  236. claude_mpm/services/monitor/management/lifecycle.py +8 -1
  237. claude_mpm/services/monitor/server.py +700 -24
  238. claude_mpm/services/pm_skills_deployer.py +676 -0
  239. claude_mpm/services/port_manager.py +1 -1
  240. claude_mpm/services/pr/__init__.py +14 -0
  241. claude_mpm/services/pr/pr_template_service.py +329 -0
  242. claude_mpm/services/profile_manager.py +331 -0
  243. claude_mpm/services/project/documentation_manager.py +2 -1
  244. claude_mpm/services/project/project_organizer.py +4 -0
  245. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  246. claude_mpm/services/runner_configuration_service.py +16 -3
  247. claude_mpm/services/self_upgrade_service.py +120 -12
  248. claude_mpm/services/session_management_service.py +16 -4
  249. claude_mpm/services/skills/__init__.py +21 -0
  250. claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
  251. claude_mpm/services/skills/selective_skill_deployer.py +704 -0
  252. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  253. claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
  254. claude_mpm/services/skills_config.py +547 -0
  255. claude_mpm/services/skills_deployer.py +1072 -0
  256. claude_mpm/services/socketio/dashboard_server.py +1 -0
  257. claude_mpm/services/socketio/event_normalizer.py +51 -6
  258. claude_mpm/services/socketio/handlers/connection.py +1 -1
  259. claude_mpm/services/socketio/handlers/git.py +1 -1
  260. claude_mpm/services/socketio/server/core.py +387 -112
  261. claude_mpm/services/socketio/server/main.py +1 -3
  262. claude_mpm/services/system_instructions_service.py +1 -3
  263. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  264. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  265. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  266. claude_mpm/services/unified/unified_deployment.py +1 -5
  267. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  268. claude_mpm/services/version_control/git_operations.py +103 -0
  269. claude_mpm/services/visualization/__init__.py +1 -5
  270. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  271. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  272. claude_mpm/skills/skill_manager.py +92 -3
  273. claude_mpm/skills/skills_registry.py +0 -1
  274. claude_mpm/templates/questions/__init__.py +38 -0
  275. claude_mpm/templates/questions/base.py +193 -0
  276. claude_mpm/templates/questions/pr_strategy.py +311 -0
  277. claude_mpm/templates/questions/project_init.py +385 -0
  278. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  279. claude_mpm/tools/__main__.py +8 -8
  280. claude_mpm/utils/agent_dependency_loader.py +91 -12
  281. claude_mpm/utils/agent_filters.py +261 -0
  282. claude_mpm/utils/dependency_cache.py +3 -1
  283. claude_mpm/utils/gitignore.py +244 -0
  284. claude_mpm/utils/migration.py +372 -0
  285. claude_mpm/utils/progress.py +387 -0
  286. claude_mpm/utils/robust_installer.py +49 -7
  287. claude_mpm/utils/structured_questions.py +619 -0
  288. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
  289. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
  290. claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
  291. claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
  292. claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
  293. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
  294. claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
  295. claude_mpm/agents/BASE_OPS.md +0 -219
  296. claude_mpm/agents/BASE_PM.md +0 -468
  297. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
  298. claude_mpm/agents/BASE_QA.md +0 -167
  299. claude_mpm/agents/BASE_RESEARCH.md +0 -53
  300. claude_mpm/agents/base_agent_loader.py +0 -626
  301. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  302. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  303. claude_mpm/agents/templates/agent-manager.json +0 -273
  304. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  305. claude_mpm/agents/templates/api_qa.json +0 -183
  306. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  307. claude_mpm/agents/templates/clerk-ops.json +0 -235
  308. claude_mpm/agents/templates/code_analyzer.json +0 -101
  309. claude_mpm/agents/templates/content-agent.json +0 -358
  310. claude_mpm/agents/templates/dart_engineer.json +0 -307
  311. claude_mpm/agents/templates/data_engineer.json +0 -225
  312. claude_mpm/agents/templates/documentation.json +0 -238
  313. claude_mpm/agents/templates/engineer.json +0 -210
  314. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  315. claude_mpm/agents/templates/golang_engineer.json +0 -270
  316. claude_mpm/agents/templates/imagemagick.json +0 -264
  317. claude_mpm/agents/templates/java_engineer.json +0 -346
  318. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  319. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  320. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  321. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  322. claude_mpm/agents/templates/memory_manager.json +0 -158
  323. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  324. claude_mpm/agents/templates/ops.json +0 -185
  325. claude_mpm/agents/templates/php-engineer.json +0 -287
  326. claude_mpm/agents/templates/product_owner.json +0 -338
  327. claude_mpm/agents/templates/project_organizer.json +0 -144
  328. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  329. claude_mpm/agents/templates/python_engineer.json +0 -387
  330. claude_mpm/agents/templates/qa.json +0 -243
  331. claude_mpm/agents/templates/react_engineer.json +0 -239
  332. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  333. claude_mpm/agents/templates/research.json +0 -188
  334. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  335. claude_mpm/agents/templates/rust_engineer.json +0 -275
  336. claude_mpm/agents/templates/security.json +0 -202
  337. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  338. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  339. claude_mpm/agents/templates/ticketing.json +0 -178
  340. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  341. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  342. claude_mpm/agents/templates/version_control.json +0 -159
  343. claude_mpm/agents/templates/web_qa.json +0 -400
  344. claude_mpm/agents/templates/web_ui.json +0 -189
  345. claude_mpm/cli/commands/agents_detect.py +0 -380
  346. claude_mpm/cli/commands/agents_recommend.py +0 -309
  347. claude_mpm/cli/ticket_cli.py +0 -35
  348. claude_mpm/commands/mpm-agents-detect.md +0 -168
  349. claude_mpm/commands/mpm-agents-recommend.md +0 -214
  350. claude_mpm/commands/mpm-agents.md +0 -122
  351. claude_mpm/commands/mpm-auto-configure.md +0 -269
  352. claude_mpm/commands/mpm-resume.md +0 -372
  353. claude_mpm/commands/mpm-tickets.md +0 -151
  354. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  355. claude_mpm/dashboard/analysis_runner.py +0 -455
  356. claude_mpm/dashboard/index.html +0 -13
  357. claude_mpm/dashboard/open_dashboard.py +0 -66
  358. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  359. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  360. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  361. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  362. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  363. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  364. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  365. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  366. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  367. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  368. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  369. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  370. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  371. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  372. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  373. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  374. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  375. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  376. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  377. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  378. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  379. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  380. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  381. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  382. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  383. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  384. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  385. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  386. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  387. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  388. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  389. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  390. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  391. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  392. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  393. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  394. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  395. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  396. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  397. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  398. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  399. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  400. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  402. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  403. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  404. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  405. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  406. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  407. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  408. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  409. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  410. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  411. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  412. claude_mpm/dashboard/static/built/react/events.js +0 -30
  413. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  414. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  415. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  416. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  417. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  418. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  419. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  420. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  421. claude_mpm/dashboard/static/css/activity.css +0 -1958
  422. claude_mpm/dashboard/static/css/connection-status.css +0 -370
  423. claude_mpm/dashboard/static/css/dashboard.css +0 -4701
  424. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  425. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  426. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  443. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  444. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  445. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  446. claude_mpm/dashboard/static/events.html +0 -607
  447. claude_mpm/dashboard/static/index.html +0 -635
  448. claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
  449. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
  450. claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
  451. claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
  452. claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
  453. claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
  454. claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
  455. claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
  456. claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
  457. claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
  458. claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
  459. claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
  460. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
  461. claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
  462. claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
  463. claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
  464. claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
  465. claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
  466. claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
  467. claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
  468. claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
  469. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
  470. claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
  471. claude_mpm/dashboard/static/js/connection-manager.js +0 -536
  472. claude_mpm/dashboard/static/js/dashboard.js +0 -1896
  473. claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
  474. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  475. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  476. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  477. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  478. claude_mpm/dashboard/static/js/socket-client.js +0 -1457
  479. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  480. claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
  481. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  482. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  483. claude_mpm/dashboard/static/legacy/files.html +0 -747
  484. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  485. claude_mpm/dashboard/static/monitors.html +0 -431
  486. claude_mpm/dashboard/static/production/events.html +0 -659
  487. claude_mpm/dashboard/static/production/main.html +0 -698
  488. claude_mpm/dashboard/static/production/monitors.html +0 -483
  489. claude_mpm/dashboard/static/socket.io.min.js +0 -7
  490. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
  491. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  492. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  493. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  494. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  495. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  496. claude_mpm/dashboard/templates/code_simple.html +0 -153
  497. claude_mpm/dashboard/templates/index.html +0 -606
  498. claude_mpm/dashboard/test_dashboard.html +0 -372
  499. claude_mpm/scripts/mcp_server.py +0 -75
  500. claude_mpm/scripts/mcp_wrapper.py +0 -39
  501. claude_mpm/services/mcp_gateway/__init__.py +0 -159
  502. claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
  503. claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
  504. claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
  505. claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
  506. claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
  507. claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
  508. claude_mpm/services/mcp_gateway/core/base.py +0 -312
  509. claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
  510. claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
  511. claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
  512. claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
  513. claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
  514. claude_mpm/services/mcp_gateway/main.py +0 -589
  515. claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
  516. claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
  517. claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
  518. claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
  519. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
  520. claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
  521. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
  522. claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
  523. claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
  524. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
  525. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
  526. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
  527. claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
  528. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
  529. claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
  530. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
  531. claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
  532. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  533. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  534. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  535. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  536. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  537. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  538. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  539. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  540. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  541. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  542. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  543. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  544. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  545. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  546. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  547. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  548. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  549. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  550. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  551. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  552. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  553. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  554. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  555. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  556. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  557. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  558. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  559. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  560. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  561. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  562. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  563. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  564. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  565. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  566. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  567. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  568. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  569. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  570. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  571. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  572. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  573. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  574. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  575. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  576. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  577. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  578. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  579. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  580. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  581. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  582. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  583. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  584. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  585. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  586. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  587. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  588. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  589. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  590. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  591. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  592. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  593. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  594. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  595. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  596. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  597. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  598. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  599. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  600. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  601. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  602. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  603. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  604. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  605. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  606. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  607. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  608. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  609. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  610. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  611. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  612. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  613. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  614. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  615. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  616. claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
  617. claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
  618. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  619. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  620. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  621. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  622. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
  623. {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
@@ -1,1718 +0,0 @@
1
- /**
2
- * HUD Visualizer Component
3
- * Manages the Cytoscape.js tree visualization for the HUD mode with lazy loading
4
- */
5
-
6
- class HUDVisualizer {
7
- constructor() {
8
- this.cy = null;
9
- this.container = null;
10
- this.nodes = new Map(); // Map of node IDs to node data
11
- this.isActive = false;
12
- this.librariesLoaded = false;
13
- this.loadingPromise = null;
14
- this.pendingEvents = []; // Store events received before libraries are loaded
15
-
16
- // Layout configuration
17
- this.layoutConfig = {
18
- name: 'dagre',
19
- rankDir: 'TB', // Top to bottom
20
- animate: true,
21
- animationDuration: 500,
22
- fit: true,
23
- padding: 30,
24
- rankSep: 100,
25
- nodeSep: 80
26
- };
27
-
28
- // Node type configurations
29
- this.nodeTypes = {
30
- PM: {
31
- color: '#48bb78',
32
- shape: 'rectangle',
33
- width: 120,
34
- height: 40,
35
- icon: '👤'
36
- },
37
- AGENT: {
38
- color: '#9f7aea',
39
- shape: 'ellipse',
40
- width: 100,
41
- height: 60,
42
- icon: '🤖'
43
- },
44
- TOOL: {
45
- color: '#4299e1',
46
- shape: 'diamond',
47
- width: 80,
48
- height: 50,
49
- icon: '🔧'
50
- },
51
- TODO: {
52
- color: '#e53e3e',
53
- shape: 'triangle',
54
- width: 70,
55
- height: 40,
56
- icon: '📝'
57
- }
58
- };
59
- }
60
-
61
- /**
62
- * Initialize the HUD visualizer (called at startup)
63
- */
64
- initialize() {
65
- this.container = document.getElementById('hud-cytoscape');
66
- if (!this.container) {
67
- console.error('HUD container not found');
68
- return false;
69
- }
70
-
71
- // Ensure container has proper attributes for interaction
72
- this.container.style.pointerEvents = 'auto';
73
- this.container.style.cursor = 'default';
74
- this.container.style.position = 'relative';
75
- this.container.style.zIndex = '1';
76
-
77
- // Setup basic event handlers (not library-dependent)
78
- this.setupBasicEventHandlers();
79
-
80
- console.log('HUD Visualizer initialized (libraries will load lazily)');
81
- return true;
82
- }
83
-
84
- /**
85
- * Load libraries and initialize Cytoscape when HUD is first activated
86
- * @returns {Promise} - Promise that resolves when libraries are loaded and Cytoscape is initialized
87
- */
88
- async loadLibrariesAndInitialize() {
89
- if (this.librariesLoaded && this.cy) {
90
- return Promise.resolve();
91
- }
92
-
93
- // If already loading, return the existing promise
94
- if (this.loadingPromise) {
95
- return this.loadingPromise;
96
- }
97
-
98
- this.loadingPromise = this._performLazyLoading();
99
- return this.loadingPromise;
100
- }
101
-
102
- /**
103
- * Perform the actual lazy loading process
104
- * @private
105
- */
106
- async _performLazyLoading() {
107
- try {
108
- console.log('[HUD-VISUALIZER-DEBUG] _performLazyLoading() called');
109
- console.log('[HUD-VISUALIZER-DEBUG] Loading HUD visualization libraries...');
110
-
111
- // Show loading indicator
112
- this.showLoadingIndicator();
113
-
114
- // Load libraries using the HUD library loader
115
- if (!window.HUDLibraryLoader) {
116
- throw new Error('HUD Library Loader not available');
117
- }
118
-
119
- console.log('[HUD-VISUALIZER-DEBUG] HUD Library Loader found, loading libraries...');
120
- await window.HUDLibraryLoader.loadHUDLibraries((progress) => {
121
- console.log('[HUD-VISUALIZER-DEBUG] Loading progress:', progress);
122
- this.updateLoadingProgress(progress);
123
- });
124
-
125
- // Verify libraries are available
126
- console.log('[HUD-VISUALIZER-DEBUG] Verifying libraries are loaded...');
127
- if (typeof window.cytoscape === 'undefined') {
128
- throw new Error('Cytoscape.js not loaded');
129
- }
130
- if (typeof window.dagre === 'undefined') {
131
- throw new Error('Dagre not loaded');
132
- }
133
- if (typeof window.cytoscapeDagre === 'undefined') {
134
- throw new Error('Cytoscape-dagre not loaded');
135
- }
136
-
137
- console.log('[HUD-VISUALIZER-DEBUG] All HUD libraries loaded successfully');
138
- this.librariesLoaded = true;
139
-
140
- // Initialize Cytoscape instance
141
- console.log('[HUD-VISUALIZER-DEBUG] Initializing Cytoscape...');
142
- this.initializeCytoscape();
143
-
144
- // Setup library-dependent event handlers
145
- console.log('[HUD-VISUALIZER-DEBUG] Setting up Cytoscape event handlers...');
146
- this.setupCytoscapeEventHandlers();
147
-
148
- // Process any pending events
149
- console.log('[HUD-VISUALIZER-DEBUG] Processing pending events...');
150
- this.processPendingEvents();
151
-
152
- // Hide loading indicator
153
- this.hideLoadingIndicator();
154
-
155
- console.log('[HUD-VISUALIZER-DEBUG] HUD Visualizer fully initialized with lazy loading');
156
- return true;
157
-
158
- } catch (error) {
159
- console.error('[HUD-VISUALIZER-DEBUG] Failed to load HUD libraries:', error);
160
- console.error('[HUD-VISUALIZER-DEBUG] Error stack:', error.stack);
161
- this.showLoadingError(error.message);
162
- this.librariesLoaded = false;
163
- this.loadingPromise = null;
164
- throw error;
165
- }
166
- }
167
-
168
- /**
169
- * Initialize Cytoscape.js instance (called after libraries are loaded)
170
- */
171
- initializeCytoscape() {
172
- if (!this.librariesLoaded || !window.cytoscape) {
173
- console.error('Cannot initialize Cytoscape: libraries not loaded');
174
- return;
175
- }
176
-
177
- // Register dagre extension for hierarchical layouts
178
- if (typeof window.cytoscape !== 'undefined' && typeof window.cytoscapeDagre !== 'undefined') {
179
- window.cytoscape.use(window.cytoscapeDagre);
180
- }
181
-
182
- this.cy = window.cytoscape({
183
- container: this.container,
184
-
185
- elements: [],
186
-
187
- // Enable user interaction
188
- userZoomingEnabled: true,
189
- userPanningEnabled: true,
190
- boxSelectionEnabled: false,
191
- autoungrabify: false,
192
- autounselectify: false,
193
-
194
- style: [
195
- // Node styles
196
- {
197
- selector: 'node',
198
- style: {
199
- 'background-color': 'data(color)',
200
- 'border-color': 'data(borderColor)',
201
- 'border-width': 2,
202
- 'color': '#ffffff',
203
- 'label': 'data(label)',
204
- 'text-valign': 'center',
205
- 'text-halign': 'center',
206
- 'font-size': '12px',
207
- 'font-weight': 'bold',
208
- 'width': 'data(width)',
209
- 'height': 'data(height)',
210
- 'shape': 'data(shape)',
211
- 'text-wrap': 'wrap',
212
- 'text-max-width': '100px'
213
- }
214
- },
215
-
216
- // Edge styles
217
- {
218
- selector: 'edge',
219
- style: {
220
- 'width': 2,
221
- 'line-color': '#718096',
222
- 'target-arrow-color': '#718096',
223
- 'target-arrow-shape': 'triangle',
224
- 'curve-style': 'bezier',
225
- 'arrow-scale': 1.2
226
- }
227
- },
228
-
229
- // Node type specific styles
230
- {
231
- selector: '.pm-node',
232
- style: {
233
- 'background-color': '#48bb78',
234
- 'border-color': '#38a169',
235
- 'shape': 'rectangle'
236
- }
237
- },
238
-
239
- {
240
- selector: '.agent-node',
241
- style: {
242
- 'background-color': '#9f7aea',
243
- 'border-color': '#805ad5',
244
- 'shape': 'ellipse'
245
- }
246
- },
247
-
248
- {
249
- selector: '.tool-node',
250
- style: {
251
- 'background-color': '#4299e1',
252
- 'border-color': '#3182ce',
253
- 'shape': 'diamond'
254
- }
255
- },
256
-
257
- {
258
- selector: '.todo-node',
259
- style: {
260
- 'background-color': '#e53e3e',
261
- 'border-color': '#c53030',
262
- 'shape': 'triangle'
263
- }
264
- },
265
-
266
- // Hover effects
267
- {
268
- selector: 'node:active',
269
- style: {
270
- 'overlay-opacity': 0.2,
271
- 'overlay-color': '#000000'
272
- }
273
- }
274
- ],
275
-
276
- layout: this.layoutConfig
277
- });
278
-
279
- // Setup resize handler
280
- this.setupResizeHandler();
281
- }
282
-
283
- /**
284
- * Setup basic event handlers (not dependent on libraries)
285
- */
286
- setupBasicEventHandlers() {
287
- // Reset layout button
288
- const resetBtn = document.getElementById('hud-reset-layout');
289
- if (resetBtn) {
290
- resetBtn.addEventListener('click', () => {
291
- this.resetLayout();
292
- });
293
- }
294
-
295
- // Center view button
296
- const centerBtn = document.getElementById('hud-center-view');
297
- if (centerBtn) {
298
- centerBtn.addEventListener('click', () => {
299
- this.centerView();
300
- });
301
- }
302
- }
303
-
304
- /**
305
- * Setup Cytoscape-dependent event handlers (called after libraries are loaded)
306
- */
307
- setupCytoscapeEventHandlers() {
308
- if (!this.cy) {
309
- console.warn('[HUD-VISUALIZER-DEBUG] Cannot setup Cytoscape event handlers: no cy instance');
310
- return;
311
- }
312
-
313
- console.log('[HUD-VISUALIZER-DEBUG] Setting up Cytoscape event handlers...');
314
-
315
- // Node click events
316
- this.cy.on('tap', 'node', (evt) => {
317
- const node = evt.target;
318
- const data = node.data();
319
- console.log('[HUD-VISUALIZER-DEBUG] Node clicked:', data);
320
-
321
- // Highlight connected nodes
322
- this.highlightConnectedNodes(node);
323
- });
324
-
325
- // Background click events
326
- this.cy.on('tap', (evt) => {
327
- if (evt.target === this.cy) {
328
- console.log('[HUD-VISUALIZER-DEBUG] Background clicked - resetting highlights');
329
- // Reset all node styles
330
- this.cy.nodes().style({
331
- 'opacity': 1
332
- });
333
-
334
- this.cy.edges().style({
335
- 'opacity': 1
336
- });
337
- }
338
- });
339
-
340
- // Mouse events for debugging
341
- this.cy.on('mouseover', 'node', (evt) => {
342
- const node = evt.target;
343
- node.style('opacity', 0.8);
344
- });
345
-
346
- this.cy.on('mouseout', 'node', (evt) => {
347
- const node = evt.target;
348
- node.style('opacity', 1);
349
- });
350
-
351
- console.log('[HUD-VISUALIZER-DEBUG] Cytoscape event handlers set up successfully');
352
- }
353
-
354
- /**
355
- * Setup resize handler for container
356
- */
357
- setupResizeHandler() {
358
- const resizeObserver = new ResizeObserver(() => {
359
- if (this.cy && this.isActive) {
360
- this.ensureContainerResize();
361
- }
362
- });
363
-
364
- if (this.container) {
365
- resizeObserver.observe(this.container);
366
- }
367
- }
368
-
369
- /**
370
- * Ensure container is properly resized and visible
371
- */
372
- ensureContainerResize() {
373
- if (!this.cy || !this.container) {
374
- console.log('[HUD-VISUALIZER-DEBUG] Cannot resize: missing cy or container');
375
- return;
376
- }
377
-
378
- // Ensure container can receive events
379
- this.ensureContainerInteractivity();
380
-
381
- // Log container dimensions
382
- const containerRect = this.container.getBoundingClientRect();
383
- console.log('[HUD-VISUALIZER-DEBUG] Container dimensions:', {
384
- width: containerRect.width,
385
- height: containerRect.height,
386
- offsetWidth: this.container.offsetWidth,
387
- offsetHeight: this.container.offsetHeight,
388
- isVisible: containerRect.width > 0 && containerRect.height > 0
389
- });
390
-
391
- // Only proceed if container is visible
392
- if (containerRect.width > 0 && containerRect.height > 0) {
393
- console.log('[HUD-VISUALIZER-DEBUG] Container is visible, resizing Cytoscape...');
394
-
395
- try {
396
- // Force Cytoscape to resize
397
- this.cy.resize();
398
-
399
- // Log Cytoscape elements
400
- const nodeCount = this.cy.nodes().length;
401
- const edgeCount = this.cy.edges().length;
402
- console.log('[HUD-VISUALIZER-DEBUG] Cytoscape elements after resize:', {
403
- nodes: nodeCount,
404
- edges: edgeCount
405
- });
406
-
407
- // If we have nodes, fit and run layout
408
- if (nodeCount > 0) {
409
- console.log('[HUD-VISUALIZER-DEBUG] Running fit and layout...');
410
- this.cy.fit();
411
- this.runLayout();
412
- } else {
413
- console.log('[HUD-VISUALIZER-DEBUG] No nodes to display');
414
- }
415
-
416
- } catch (error) {
417
- console.error('[HUD-VISUALIZER-DEBUG] Error during resize:', error);
418
- }
419
- } else {
420
- console.log('[HUD-VISUALIZER-DEBUG] Container not visible yet, skipping resize');
421
- }
422
- }
423
-
424
- /**
425
- * Ensure container can receive mouse and touch events
426
- */
427
- ensureContainerInteractivity() {
428
- if (!this.container) return;
429
-
430
- // Force container to be interactive
431
- this.container.style.pointerEvents = 'auto';
432
- this.container.style.cursor = 'default';
433
- this.container.style.userSelect = 'none';
434
- this.container.style.touchAction = 'manipulation';
435
-
436
- // Remove any overlapping elements that might block events
437
- const parent = this.container.parentElement;
438
- if (parent) {
439
- parent.style.pointerEvents = 'auto';
440
- parent.style.position = 'relative';
441
- }
442
-
443
- console.log('[HUD-VISUALIZER-DEBUG] Container interactivity ensured');
444
- }
445
-
446
- /**
447
- * Activate the HUD visualizer (triggers lazy loading if needed)
448
- */
449
- async activate() {
450
- console.log('[HUD-VISUALIZER-DEBUG] activate() called');
451
- this.isActive = true;
452
-
453
- try {
454
- console.log('[HUD-VISUALIZER-DEBUG] Loading libraries and initializing...');
455
- // Load libraries if not already loaded
456
- await this.loadLibrariesAndInitialize();
457
-
458
- console.log('[HUD-VISUALIZER-DEBUG] Libraries loaded, cy exists:', !!this.cy);
459
-
460
- // If Cytoscape was destroyed during clearing, recreate it
461
- if (!this.cy) {
462
- console.log('[HUD-VISUALIZER-DEBUG] Cytoscape instance missing, recreating...');
463
- this.initializeCytoscape();
464
- this.setupCytoscapeEventHandlers();
465
- }
466
-
467
- if (this.cy) {
468
- // Wait for container to be visible, then trigger resize and fit
469
- console.log('[HUD-VISUALIZER-DEBUG] Triggering resize and fit...');
470
-
471
- // Multiple resize attempts to ensure container visibility
472
- setTimeout(() => {
473
- console.log('[HUD-VISUALIZER-DEBUG] First resize attempt...');
474
- this.ensureContainerResize();
475
- }, 50);
476
-
477
- setTimeout(() => {
478
- console.log('[HUD-VISUALIZER-DEBUG] Second resize attempt...');
479
- this.ensureContainerResize();
480
- }, 200);
481
-
482
- setTimeout(() => {
483
- console.log('[HUD-VISUALIZER-DEBUG] Final resize attempt...');
484
- this.ensureContainerResize();
485
- }, 500);
486
- }
487
- console.log('[HUD-VISUALIZER-DEBUG] activate() completed successfully');
488
- } catch (error) {
489
- console.error('[HUD-VISUALIZER-DEBUG] Failed to activate HUD:', error);
490
- console.error('[HUD-VISUALIZER-DEBUG] Error stack:', error.stack);
491
- // Keep isActive true so user can retry
492
- throw error; // Re-throw so the promise rejects properly
493
- }
494
- }
495
-
496
- /**
497
- * Deactivate the HUD visualizer
498
- */
499
- deactivate() {
500
- this.isActive = false;
501
- }
502
-
503
- /**
504
- * Process pending events that were received before libraries loaded
505
- */
506
- processPendingEvents() {
507
- if (this.pendingEvents.length > 0) {
508
- console.log(`Processing ${this.pendingEvents.length} pending events`);
509
-
510
- for (const event of this.pendingEvents) {
511
- this._processEventInternal(event);
512
- }
513
-
514
- this.pendingEvents = [];
515
- }
516
- }
517
-
518
- /**
519
- * Process existing events from dashboard when HUD is activated
520
- * This builds the complete tree structure from historical events
521
- * @param {Array} events - Array of sorted historical events
522
- */
523
- processExistingEvents(events) {
524
- console.log(`[HUD-VISUALIZER-DEBUG] processExistingEvents called with ${events ? events.length : 0} events`);
525
-
526
- if (!events) {
527
- console.error('[HUD-VISUALIZER-DEBUG] No events provided to processExistingEvents');
528
- return;
529
- }
530
-
531
- if (!Array.isArray(events)) {
532
- console.error('[HUD-VISUALIZER-DEBUG] Events is not an array:', typeof events);
533
- return;
534
- }
535
-
536
- console.log(`[HUD-VISUALIZER-DEBUG] Libraries loaded: ${this.librariesLoaded}, Cytoscape available: ${!!this.cy}`);
537
-
538
- if (!this.librariesLoaded || !this.cy) {
539
- console.warn('[HUD-VISUALIZER-DEBUG] HUD libraries not loaded, cannot process existing events');
540
- console.log(`[HUD-VISUALIZER-DEBUG] Storing ${events.length} events as pending`);
541
- this.pendingEvents = [...events];
542
- return;
543
- }
544
-
545
- console.log(`[HUD-VISUALIZER-DEBUG] 🏗️ Building HUD tree structure from ${events.length} historical events`);
546
-
547
- // Log sample events to understand structure
548
- if (events.length > 0) {
549
- console.log('[HUD-VISUALIZER-DEBUG] Sample events:');
550
- events.slice(0, 3).forEach((event, i) => {
551
- console.log(`[HUD-VISUALIZER-DEBUG] Event ${i + 1}:`, {
552
- timestamp: event.timestamp,
553
- hook_event_name: event.hook_event_name,
554
- type: event.type,
555
- subtype: event.subtype,
556
- session_id: event.session_id,
557
- data_session_id: event.data?.session_id,
558
- data_keys: event.data ? Object.keys(event.data) : 'no data'
559
- });
560
- });
561
- }
562
-
563
- // Clear any existing visualization
564
- this.clear();
565
-
566
- // Group events by session to build proper hierarchies
567
- const sessionGroups = this.groupEventsBySession(events);
568
-
569
- // Process each session group to build trees
570
- Object.entries(sessionGroups).forEach(([sessionId, sessionEvents]) => {
571
- console.log(` 📂 Processing session ${sessionId}: ${sessionEvents.length} events`);
572
- this.buildSessionTree(sessionId, sessionEvents);
573
- });
574
-
575
- // Run final layout to organize the complete visualization
576
- this.runLayout();
577
-
578
- console.log(`✅ HUD tree structure built successfully`);
579
- }
580
-
581
- /**
582
- * Group events by session ID for hierarchical processing
583
- * @param {Array} events - Array of events
584
- * @returns {Object} Object with session IDs as keys and event arrays as values
585
- */
586
- groupEventsBySession(events) {
587
- const sessionGroups = {};
588
-
589
- events.forEach(event => {
590
- const sessionId = event.session_id || event.data?.session_id || 'unknown';
591
- if (!sessionGroups[sessionId]) {
592
- sessionGroups[sessionId] = [];
593
- }
594
- sessionGroups[sessionId].push(event);
595
- });
596
-
597
- return sessionGroups;
598
- }
599
-
600
- /**
601
- * Build a tree structure for a specific session
602
- * @param {string} sessionId - Session identifier
603
- * @param {Array} sessionEvents - Events for this session
604
- */
605
- buildSessionTree(sessionId, sessionEvents) {
606
- console.log(`[HUD-VISUALIZER-DEBUG] Building session tree for ${sessionId} with ${sessionEvents.length} events`);
607
-
608
- const sessionNodes = new Map(); // Track nodes created for this session
609
- let sessionRootNode = null;
610
-
611
- // Sort events chronologically within the session
612
- const sortedEvents = sessionEvents.sort((a, b) => {
613
- return new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime();
614
- });
615
-
616
- console.log(`[HUD-VISUALIZER-DEBUG] Sorted ${sortedEvents.length} events chronologically`);
617
-
618
- sortedEvents.forEach((event, index) => {
619
- const nodeData = this.createNodeFromEvent(event, sessionId);
620
- if (!nodeData) return;
621
-
622
- // Add the node to visualization
623
- this.addNode(nodeData.id, nodeData.type, nodeData.label, {
624
- sessionId: sessionId,
625
- timestamp: event.timestamp,
626
- eventData: event,
627
- isSessionRoot: nodeData.isSessionRoot
628
- });
629
-
630
- sessionNodes.set(nodeData.id, {
631
- ...nodeData,
632
- event: event,
633
- index: index
634
- });
635
-
636
- // Track session root node
637
- if (nodeData.isSessionRoot && !sessionRootNode) {
638
- sessionRootNode = nodeData.id;
639
- }
640
-
641
- // Create relationships based on event context
642
- this.createHierarchicalRelationships(nodeData.id, event, sessionNodes, sessionRootNode);
643
- });
644
- }
645
-
646
- /**
647
- * Create node data from an event
648
- * @param {Object} event - Event object
649
- * @param {string} sessionId - Session ID
650
- * @returns {Object|null} Node data or null if event should be skipped
651
- */
652
- createNodeFromEvent(event, sessionId) {
653
- const eventType = event.hook_event_name || event.type || '';
654
- const subtype = event.subtype || '';
655
- const timestamp = new Date(event.timestamp || Date.now());
656
-
657
- console.log(`[HUD-VISUALIZER-DEBUG] Creating node from event: ${eventType}/${subtype} for session ${sessionId}`);
658
-
659
- let nodeId, nodeType, label, isSessionRoot = false;
660
-
661
- // Generate a unique timestamp-based ID suffix
662
- const timestampId = timestamp.getTime();
663
- const randomSuffix = Math.random().toString(36).substring(2, 7);
664
-
665
- // Determine node type and create appropriate visualization
666
- if (eventType === 'session' && subtype === 'started') {
667
- // Session root node
668
- nodeType = 'PM';
669
- label = `Session ${sessionId.substring(0, 8)}...`;
670
- nodeId = `session-${sessionId.replace(/[^a-zA-Z0-9]/g, '')}`;
671
- isSessionRoot = true;
672
-
673
- } else if (eventType === 'hook' && subtype === 'user_prompt') {
674
- // User prompts are major workflow nodes
675
- nodeType = 'PM';
676
- const promptPreview = event.data?.prompt_preview || 'User Prompt';
677
- label = promptPreview.length > 20 ? promptPreview.substring(0, 20) + '...' : promptPreview;
678
- nodeId = `user-prompt-${timestampId}-${randomSuffix}`;
679
-
680
- } else if (eventType === 'hook' && subtype === 'claude_response') {
681
- // Claude responses
682
- nodeType = 'PM';
683
- label = 'Claude Response';
684
- nodeId = `claude-response-${timestampId}-${randomSuffix}`;
685
-
686
- } else if (eventType === 'hook' && subtype === 'pre_tool') {
687
- // Tool calls - pre hook
688
- nodeType = 'TOOL';
689
- const toolName = event.data?.tool_name || 'Unknown Tool';
690
- // Clean tool name for ID
691
- const cleanToolName = toolName.replace(/[^a-zA-Z0-9]/g, '');
692
- label = `${toolName}`;
693
- nodeId = `tool-${cleanToolName}-${timestampId}-${randomSuffix}`;
694
-
695
- } else if (eventType === 'agent' || event.data?.agent_type) {
696
- // Agent operations
697
- nodeType = 'AGENT';
698
- const agentName = event.data?.agent_type || event.data?.agent_name || 'Agent';
699
- // Clean agent name for ID
700
- const cleanAgentName = agentName.replace(/[^a-zA-Z0-9]/g, '');
701
- label = agentName;
702
- nodeId = `agent-${cleanAgentName}-${timestampId}-${randomSuffix}`;
703
-
704
- } else if (eventType === 'todo' || subtype.includes('todo')) {
705
- // Todo operations
706
- nodeType = 'TODO';
707
- label = 'Todo Update';
708
- nodeId = `todo-${timestampId}-${randomSuffix}`;
709
-
710
- } else if (eventType === 'hook' && subtype === 'notification') {
711
- // Skip notifications for cleaner visualization
712
- return null;
713
-
714
- } else if (eventType === 'log') {
715
- // Skip log events for cleaner visualization unless they're errors
716
- const level = event.data?.level || 'info';
717
- if (!['error', 'critical'].includes(level)) {
718
- return null;
719
- }
720
- nodeType = 'PM';
721
- label = `${level.toUpperCase()} Log`;
722
- nodeId = `log-${level}-${timestampId}-${randomSuffix}`;
723
-
724
- } else {
725
- // Generic event node
726
- nodeType = 'PM';
727
- const cleanEventType = eventType.replace(/[^a-zA-Z0-9]/g, '') || 'Event';
728
- label = eventType || 'Event';
729
- nodeId = `generic-${cleanEventType}-${timestampId}-${randomSuffix}`;
730
- }
731
-
732
- return {
733
- id: nodeId,
734
- type: nodeType,
735
- label: label,
736
- isSessionRoot: isSessionRoot
737
- };
738
- }
739
-
740
- /**
741
- * Create hierarchical relationships between nodes based on event context
742
- * @param {string} nodeId - Current node ID
743
- * @param {Object} event - Current event
744
- * @param {Map} sessionNodes - Map of all nodes in this session
745
- * @param {string} sessionRootNode - Root node ID for this session
746
- */
747
- createHierarchicalRelationships(nodeId, event, sessionNodes, sessionRootNode) {
748
- const eventType = event.hook_event_name || event.type || '';
749
- const subtype = event.subtype || '';
750
-
751
- // Find appropriate parent node based on event context
752
- let parentNodeId = null;
753
-
754
- if (eventType === 'session' && subtype === 'started') {
755
- // Session start nodes have no parent
756
- return;
757
-
758
- } else if (eventType === 'hook' && subtype === 'pre_tool') {
759
- // Tool calls should connect to the most recent user prompt or agent
760
- parentNodeId = this.findRecentParentNode(sessionNodes, ['user-prompt', 'agent'], nodeId);
761
-
762
- } else if (eventType === 'hook' && subtype === 'claude_response') {
763
- // Claude responses should connect to user prompts
764
- parentNodeId = this.findRecentParentNode(sessionNodes, ['user-prompt'], nodeId);
765
-
766
- } else if (eventType === 'agent') {
767
- // Agents should connect to user prompts or other agents (delegation)
768
- parentNodeId = this.findRecentParentNode(sessionNodes, ['user-prompt', 'agent'], nodeId);
769
-
770
- } else if (eventType === 'todo') {
771
- // Todos should connect to agents or user prompts
772
- parentNodeId = this.findRecentParentNode(sessionNodes, ['agent', 'user-prompt'], nodeId);
773
-
774
- } else {
775
- // Default: connect to most recent significant node
776
- parentNodeId = this.findRecentParentNode(sessionNodes, ['user-prompt', 'agent', 'session'], nodeId);
777
- }
778
-
779
- // If no specific parent found, connect to session root
780
- if (!parentNodeId && sessionRootNode && nodeId !== sessionRootNode) {
781
- parentNodeId = sessionRootNode;
782
- }
783
-
784
- // Create the edge if parent exists
785
- if (parentNodeId && parentNodeId !== nodeId) {
786
- this.addEdge(parentNodeId, nodeId);
787
- }
788
- }
789
-
790
- /**
791
- * Find the most recent parent node of specified types
792
- * @param {Map} sessionNodes - Map of session nodes
793
- * @param {Array} nodeTypes - Array of node type prefixes to search for
794
- * @param {string} currentNodeId - Current node ID to exclude from search
795
- * @returns {string|null} Parent node ID or null
796
- */
797
- findRecentParentNode(sessionNodes, nodeTypes, currentNodeId) {
798
- const nodeEntries = Array.from(sessionNodes.entries()).reverse(); // Most recent first
799
-
800
- for (const [nodeId, nodeData] of nodeEntries) {
801
- if (nodeId === currentNodeId) continue; // Skip current node
802
-
803
- // Check if this node matches any of the desired parent types
804
- for (const typePrefix of nodeTypes) {
805
- if (nodeId.startsWith(typePrefix)) {
806
- return nodeId;
807
- }
808
- }
809
- }
810
-
811
- return null;
812
- }
813
-
814
- /**
815
- * Process a socket event and add appropriate nodes/edges
816
- * @param {Object} event - Socket event data
817
- */
818
- processEvent(event) {
819
- if (!this.isActive) return;
820
-
821
- // If libraries aren't loaded yet, store the event for later processing
822
- if (!this.librariesLoaded || !this.cy) {
823
- this.pendingEvents.push(event);
824
- return;
825
- }
826
-
827
- this._processEventInternal(event);
828
- }
829
-
830
- /**
831
- * Internal event processing (assumes libraries are loaded)
832
- * @private
833
- */
834
- _processEventInternal(event) {
835
- const eventType = event.hook_event_name || event.type || '';
836
- const sessionId = event.session_id || 'unknown';
837
- const timestamp = new Date(event.timestamp || Date.now());
838
-
839
- // Create a unique node ID based on event type and data
840
- let nodeId = `${eventType}-${timestamp.getTime()}`;
841
- let nodeType = 'PM';
842
- let label = eventType;
843
-
844
- // Determine node type based on event
845
- if (eventType.includes('tool_call')) {
846
- nodeType = 'TOOL';
847
- const toolName = event.data?.tool_name || 'Unknown Tool';
848
- label = toolName;
849
- nodeId = `tool-${toolName}-${timestamp.getTime()}`;
850
- } else if (eventType.includes('agent')) {
851
- nodeType = 'AGENT';
852
- const agentName = event.data?.agent_name || 'Agent';
853
- label = agentName;
854
- nodeId = `agent-${agentName}-${timestamp.getTime()}`;
855
- } else if (eventType.includes('todo')) {
856
- nodeType = 'TODO';
857
- label = 'Todo List';
858
- nodeId = `todo-${timestamp.getTime()}`;
859
- } else if (eventType.includes('user_prompt') || eventType.includes('claude_response')) {
860
- nodeType = 'PM';
861
- label = eventType.includes('user_prompt') ? 'User Prompt' : 'Claude Response';
862
- nodeId = `pm-${label.replace(' ', '')}-${timestamp.getTime()}`;
863
- }
864
-
865
- // Add the node
866
- this.addNode(nodeId, nodeType, label, {
867
- sessionId: sessionId,
868
- timestamp: timestamp.toISOString(),
869
- eventData: event
870
- });
871
-
872
- // Add edges based on relationships
873
- this.createEventRelationships(nodeId, event);
874
- }
875
-
876
- /**
877
- * Add a node to the visualization
878
- * @param {string} id - Unique node identifier
879
- * @param {string} type - Node type (PM, AGENT, TOOL, TODO)
880
- * @param {string} label - Node label
881
- * @param {Object} data - Additional node data
882
- */
883
- addNode(id, type, label, data = {}) {
884
- console.log(`[HUD-VISUALIZER-DEBUG] Adding node: ${id} (${type}) - ${label}`);
885
-
886
- if (this.nodes.has(id)) {
887
- console.log(`[HUD-VISUALIZER-DEBUG] Node ${id} already exists, skipping`);
888
- return; // Node already exists
889
- }
890
-
891
- const nodeType = this.nodeTypes[type] || this.nodeTypes.PM;
892
- const nodeData = {
893
- id: id,
894
- label: `${nodeType.icon} ${label}`,
895
- type: type,
896
- color: nodeType.color,
897
- borderColor: this.darkenColor(nodeType.color, 20),
898
- shape: nodeType.shape,
899
- width: nodeType.width,
900
- height: nodeType.height,
901
- ...data
902
- };
903
-
904
- this.nodes.set(id, nodeData);
905
-
906
- if (this.cy) {
907
- const element = {
908
- group: 'nodes',
909
- data: nodeData,
910
- classes: `${type.toLowerCase()}-node`
911
- };
912
-
913
- console.log(`[HUD-VISUALIZER-DEBUG] Adding node element to Cytoscape:`, element);
914
- this.cy.add(element);
915
- console.log(`[HUD-VISUALIZER-DEBUG] Node added successfully. Total nodes in cy: ${this.cy.nodes().length}`);
916
- this.runLayout();
917
- }
918
- }
919
-
920
- /**
921
- * Add an edge between two nodes
922
- * @param {string} sourceId - Source node ID
923
- * @param {string} targetId - Target node ID
924
- * @param {string} edgeId - Unique edge identifier
925
- * @param {Object} data - Additional edge data
926
- */
927
- addEdge(sourceId, targetId, edgeId = null, data = {}) {
928
- if (!sourceId || !targetId) {
929
- console.warn(`[HUD-VISUALIZER-DEBUG] Cannot create edge: missing source (${sourceId}) or target (${targetId})`);
930
- return;
931
- }
932
-
933
- if (sourceId === targetId) {
934
- console.warn(`[HUD-VISUALIZER-DEBUG] Cannot create self-loop edge from ${sourceId} to itself`);
935
- return;
936
- }
937
-
938
- if (!edgeId) {
939
- edgeId = `edge-${sourceId}-to-${targetId}`;
940
- }
941
-
942
- if (this.cy) {
943
- // Check if edge already exists
944
- const existingEdge = this.cy.getElementById(edgeId);
945
- if (existingEdge.length > 0) {
946
- console.log(`[HUD-VISUALIZER-DEBUG] Edge ${edgeId} already exists, skipping`);
947
- return;
948
- }
949
-
950
- // Check if nodes exist
951
- const sourceNode = this.cy.getElementById(sourceId);
952
- const targetNode = this.cy.getElementById(targetId);
953
-
954
- if (sourceNode.length === 0) {
955
- console.warn(`[HUD-VISUALIZER-DEBUG] Source node ${sourceId} does not exist, cannot create edge`);
956
- return;
957
- }
958
-
959
- if (targetNode.length === 0) {
960
- console.warn(`[HUD-VISUALIZER-DEBUG] Target node ${targetId} does not exist, cannot create edge`);
961
- return;
962
- }
963
-
964
- const element = {
965
- group: 'edges',
966
- data: {
967
- id: edgeId,
968
- source: sourceId,
969
- target: targetId,
970
- ...data
971
- }
972
- };
973
-
974
- console.log(`[HUD-VISUALIZER-DEBUG] Adding edge element to Cytoscape:`, element);
975
-
976
- try {
977
- this.cy.add(element);
978
- console.log(`[HUD-VISUALIZER-DEBUG] Edge added successfully. Total edges in cy: ${this.cy.edges().length}`);
979
- this.runLayout();
980
- } catch (error) {
981
- console.error(`[HUD-VISUALIZER-DEBUG] Failed to add edge ${edgeId}:`, error);
982
- console.error(`[HUD-VISUALIZER-DEBUG] Element details:`, element);
983
- }
984
- }
985
- }
986
-
987
- /**
988
- * Create relationships between events
989
- * @param {string} nodeId - Current node ID
990
- * @param {Object} event - Event data
991
- */
992
- createEventRelationships(nodeId, event) {
993
- const eventType = event.hook_event_name || event.type || '';
994
- const sessionId = event.session_id || 'unknown';
995
-
996
- // Find parent nodes based on event relationships
997
- const allNodeEntries = Array.from(this.nodes.entries());
998
-
999
- // Tool call relationships
1000
- if (eventType.includes('tool_call') && event.data?.tool_name) {
1001
- // Connect tool calls to their invoking agent/PM nodes
1002
- const parentNode = this.findParentNode(sessionId, ['PM', 'AGENT']);
1003
- if (parentNode) {
1004
- this.addEdge(parentNode, nodeId);
1005
- return;
1006
- }
1007
- }
1008
-
1009
- // Agent delegation relationships
1010
- if (eventType.includes('agent') || event.data?.agent_name) {
1011
- // Connect agents to PM nodes
1012
- const pmNode = this.findParentNode(sessionId, ['PM']);
1013
- if (pmNode) {
1014
- this.addEdge(pmNode, nodeId);
1015
- return;
1016
- }
1017
- }
1018
-
1019
- // Todo relationships - connect to agent or PM nodes
1020
- if (eventType.includes('todo')) {
1021
- const parentNode = this.findParentNode(sessionId, ['AGENT', 'PM']);
1022
- if (parentNode) {
1023
- this.addEdge(parentNode, nodeId);
1024
- return;
1025
- }
1026
- }
1027
-
1028
- // Default sequential relationship
1029
- const allNodes = Array.from(this.nodes.keys());
1030
- const currentIndex = allNodes.indexOf(nodeId);
1031
-
1032
- if (currentIndex > 0) {
1033
- const previousNodeId = allNodes[currentIndex - 1];
1034
- this.addEdge(previousNodeId, nodeId);
1035
- }
1036
- }
1037
-
1038
- /**
1039
- * Find a parent node of specific types for the same session
1040
- * @param {string} sessionId - Session ID
1041
- * @param {Array} nodeTypes - Array of node types to search for
1042
- * @returns {string|null} - Parent node ID or null
1043
- */
1044
- findParentNode(sessionId, nodeTypes) {
1045
- const nodeEntries = Array.from(this.nodes.entries()).reverse(); // Start from most recent
1046
-
1047
- for (const [nodeId, nodeData] of nodeEntries) {
1048
- if (nodeData.sessionId === sessionId && nodeTypes.includes(nodeData.type)) {
1049
- return nodeId;
1050
- }
1051
- }
1052
-
1053
- return null;
1054
- }
1055
-
1056
- /**
1057
- * Highlight connected nodes
1058
- * @param {Object} node - Cytoscape node object
1059
- */
1060
- highlightConnectedNodes(node) {
1061
- if (!this.cy) return;
1062
-
1063
- // Reset all node styles
1064
- this.cy.nodes().style({
1065
- 'opacity': 0.3
1066
- });
1067
-
1068
- this.cy.edges().style({
1069
- 'opacity': 0.2
1070
- });
1071
-
1072
- // Highlight selected node and its neighborhood
1073
- const neighborhood = node.neighborhood();
1074
- node.style('opacity', 1);
1075
- neighborhood.style('opacity', 1);
1076
- }
1077
-
1078
- /**
1079
- * Reset layout
1080
- */
1081
- resetLayout() {
1082
- if (this.cy) {
1083
- this.cy.layout(this.layoutConfig).run();
1084
- }
1085
- }
1086
-
1087
- /**
1088
- * Center view
1089
- */
1090
- centerView() {
1091
- if (this.cy) {
1092
- this.cy.fit();
1093
- this.cy.center();
1094
- }
1095
- }
1096
-
1097
- /**
1098
- * Run layout animation
1099
- */
1100
- runLayout() {
1101
- console.log(`[HUD-VISUALIZER-DEBUG] runLayout called - isActive: ${this.isActive}, cy exists: ${!!this.cy}`);
1102
- if (this.cy && this.isActive) {
1103
- const nodeCount = this.cy.nodes().length;
1104
- const edgeCount = this.cy.edges().length;
1105
- console.log(`[HUD-VISUALIZER-DEBUG] Running layout with ${nodeCount} nodes and ${edgeCount} edges`);
1106
-
1107
- // Check container dimensions before layout
1108
- if (this.container) {
1109
- const rect = this.container.getBoundingClientRect();
1110
- console.log(`[HUD-VISUALIZER-DEBUG] Container dimensions before layout:`, {
1111
- width: rect.width,
1112
- height: rect.height,
1113
- offsetWidth: this.container.offsetWidth,
1114
- offsetHeight: this.container.offsetHeight
1115
- });
1116
- }
1117
-
1118
- const layout = this.cy.layout(this.layoutConfig);
1119
-
1120
- // Listen for layout completion
1121
- layout.on('layoutstop', () => {
1122
- console.log(`[HUD-VISUALIZER-DEBUG] Layout completed. Final node positions:`);
1123
- this.cy.nodes().forEach((node, index) => {
1124
- const position = node.position();
1125
- const data = node.data();
1126
- console.log(`[HUD-VISUALIZER-DEBUG] Node ${index + 1}: ${data.label} at (${position.x.toFixed(1)}, ${position.y.toFixed(1)})`);
1127
- });
1128
- });
1129
-
1130
- layout.run();
1131
- } else {
1132
- console.log(`[HUD-VISUALIZER-DEBUG] Skipping layout - not active or no Cytoscape instance`);
1133
- }
1134
- }
1135
-
1136
- /**
1137
- * Clear all nodes and edges
1138
- */
1139
- clear() {
1140
- console.log(`[HUD-VISUALIZER-DEBUG] Clearing HUD: ${this.nodes.size} nodes, ${this.pendingEvents.length} pending events`);
1141
- this.nodes.clear();
1142
- this.pendingEvents = [];
1143
- if (this.cy) {
1144
- const elementCount = this.cy.elements().length;
1145
- try {
1146
- this.cy.elements().remove();
1147
- console.log(`[HUD-VISUALIZER-DEBUG] Removed ${elementCount} Cytoscape elements`);
1148
- } catch (error) {
1149
- console.error(`[HUD-VISUALIZER-DEBUG] Error clearing Cytoscape elements:`, error);
1150
- // Try to destroy and recreate if clearing fails
1151
- try {
1152
- this.cy.destroy();
1153
- this.cy = null;
1154
- console.log(`[HUD-VISUALIZER-DEBUG] Destroyed Cytoscape instance due to clear error`);
1155
- } catch (destroyError) {
1156
- console.error(`[HUD-VISUALIZER-DEBUG] Error destroying Cytoscape:`, destroyError);
1157
- }
1158
- }
1159
- }
1160
- }
1161
-
1162
- /**
1163
- * Show loading indicator
1164
- */
1165
- showLoadingIndicator() {
1166
- if (this.container) {
1167
- this.container.innerHTML = `
1168
- <div class="hud-loading-container">
1169
- <div class="hud-loading-spinner"></div>
1170
- <div class="hud-loading-text">Loading HUD visualization libraries...</div>
1171
- <div class="hud-loading-progress" id="hud-loading-progress"></div>
1172
- </div>
1173
- `;
1174
- }
1175
- }
1176
-
1177
- /**
1178
- * Update loading progress
1179
- */
1180
- updateLoadingProgress(progress) {
1181
- const progressElement = document.getElementById('hud-loading-progress');
1182
- if (progressElement) {
1183
- if (progress.error) {
1184
- progressElement.innerHTML = `<span class="hud-error">❌ ${progress.message}</span>`;
1185
- } else {
1186
- progressElement.innerHTML = `
1187
- <div class="hud-progress-bar">
1188
- <div class="hud-progress-fill" style="width: ${(progress.current / progress.total) * 100}%"></div>
1189
- </div>
1190
- <div class="hud-progress-text">${progress.message} (${progress.current}/${progress.total})</div>
1191
- `;
1192
- }
1193
- }
1194
- }
1195
-
1196
- /**
1197
- * Hide loading indicator
1198
- */
1199
- hideLoadingIndicator() {
1200
- if (this.container) {
1201
- this.container.innerHTML = '';
1202
- }
1203
- }
1204
-
1205
- /**
1206
- * Show loading error
1207
- */
1208
- showLoadingError(message) {
1209
- if (this.container) {
1210
- this.container.innerHTML = `
1211
- <div class="hud-error-container">
1212
- <div class="hud-error-icon">⚠️</div>
1213
- <div class="hud-error-text">Failed to load HUD libraries</div>
1214
- <div class="hud-error-message">${message}</div>
1215
- <button class="hud-retry-button" onclick="window.hudVisualizer && window.hudVisualizer.retryLoading()">
1216
- Retry Loading
1217
- </button>
1218
- </div>
1219
- `;
1220
- }
1221
- }
1222
-
1223
- /**
1224
- * Retry loading libraries (called from error UI)
1225
- */
1226
- retryLoading() {
1227
- this.librariesLoaded = false;
1228
- this.loadingPromise = null;
1229
- this.activate();
1230
- }
1231
-
1232
- /**
1233
- * Debug method to manually test HUD visualizer
1234
- * Can be called from browser console: window.hudVisualizer.debugTest()
1235
- */
1236
- debugTest() {
1237
- console.log('[HUD-VISUALIZER-DEBUG] debugTest() called manually');
1238
- console.log('[HUD-VISUALIZER-DEBUG] Current state:', {
1239
- isActive: this.isActive,
1240
- librariesLoaded: this.librariesLoaded,
1241
- hasCy: !!this.cy,
1242
- hasContainer: !!this.container,
1243
- nodeCount: this.nodes.size,
1244
- pendingEventCount: this.pendingEvents.length,
1245
- hasHUDLibraryLoader: !!window.HUDLibraryLoader
1246
- });
1247
-
1248
- // Test container
1249
- if (this.container) {
1250
- console.log('[HUD-VISUALIZER-DEBUG] Container info:', {
1251
- id: this.container.id,
1252
- className: this.container.className,
1253
- offsetWidth: this.container.offsetWidth,
1254
- offsetHeight: this.container.offsetHeight,
1255
- innerHTML: this.container.innerHTML ? 'has content' : 'empty'
1256
- });
1257
- }
1258
-
1259
- // Test library availability
1260
- console.log('[HUD-VISUALIZER-DEBUG] Library availability:', {
1261
- cytoscape: typeof window.cytoscape,
1262
- dagre: typeof window.dagre,
1263
- cytoscapeDagre: typeof window.cytoscapeDagre,
1264
- HUDLibraryLoader: typeof window.HUDLibraryLoader
1265
- });
1266
-
1267
- return {
1268
- isActive: this.isActive,
1269
- librariesLoaded: this.librariesLoaded,
1270
- hasCy: !!this.cy,
1271
- containerFound: !!this.container
1272
- };
1273
- }
1274
-
1275
- /**
1276
- * Comprehensive debug method to identify blank screen issues
1277
- * Can be called from browser console: window.hudVisualizer.debugBlankScreen()
1278
- */
1279
- debugBlankScreen() {
1280
- console.log('[HUD-BLANK-SCREEN-DEBUG] =================================');
1281
- console.log('[HUD-BLANK-SCREEN-DEBUG] COMPREHENSIVE BLANK SCREEN DEBUG');
1282
- console.log('[HUD-BLANK-SCREEN-DEBUG] =================================');
1283
-
1284
- // 1. Check basic state
1285
- const basicState = {
1286
- isActive: this.isActive,
1287
- librariesLoaded: this.librariesLoaded,
1288
- hasCy: !!this.cy,
1289
- hasContainer: !!this.container,
1290
- nodeCount: this.nodes.size,
1291
- cytoscapeElementCount: this.cy ? this.cy.elements().length : 0
1292
- };
1293
- console.log('[HUD-BLANK-SCREEN-DEBUG] 1. Basic State:', basicState);
1294
-
1295
- // 2. Check container visibility and dimensions
1296
- if (this.container) {
1297
- const containerInfo = this.getContainerDebugInfo();
1298
- console.log('[HUD-BLANK-SCREEN-DEBUG] 2. Container Info:', containerInfo);
1299
-
1300
- // Add background color to verify container is visible
1301
- this.debugAddContainerBackground();
1302
- } else {
1303
- console.error('[HUD-BLANK-SCREEN-DEBUG] 2. Container not found!');
1304
- return false;
1305
- }
1306
-
1307
- // 3. Check Cytoscape state
1308
- if (this.cy) {
1309
- const cytoscapeInfo = this.getCytoscapeDebugInfo();
1310
- console.log('[HUD-BLANK-SCREEN-DEBUG] 3. Cytoscape Info:', cytoscapeInfo);
1311
- } else {
1312
- console.error('[HUD-BLANK-SCREEN-DEBUG] 3. Cytoscape instance not found!');
1313
- return false;
1314
- }
1315
-
1316
- // 4. Check node positions
1317
- this.debugNodePositions();
1318
-
1319
- // 5. Try manual rendering triggers
1320
- this.debugManualRenderingTriggers();
1321
-
1322
- // 6. Add test nodes if none exist
1323
- if (this.cy && this.cy.nodes().length === 0) {
1324
- console.log('[HUD-BLANK-SCREEN-DEBUG] 6. No nodes found, adding test nodes...');
1325
- this.debugAddTestNodes();
1326
- }
1327
-
1328
- // 7. Force zoom fit
1329
- this.debugForceZoomFit();
1330
-
1331
- console.log('[HUD-BLANK-SCREEN-DEBUG] Debug complete. Check visual results.');
1332
- return true;
1333
- }
1334
-
1335
- /**
1336
- * Get comprehensive container debug information
1337
- */
1338
- getContainerDebugInfo() {
1339
- const rect = this.container.getBoundingClientRect();
1340
- const computed = window.getComputedStyle(this.container);
1341
-
1342
- return {
1343
- id: this.container.id,
1344
- className: this.container.className,
1345
- // Dimensions
1346
- offsetWidth: this.container.offsetWidth,
1347
- offsetHeight: this.container.offsetHeight,
1348
- clientWidth: this.container.clientWidth,
1349
- clientHeight: this.container.clientHeight,
1350
- scrollWidth: this.container.scrollWidth,
1351
- scrollHeight: this.container.scrollHeight,
1352
- // Bounding rect
1353
- boundingRect: {
1354
- width: rect.width,
1355
- height: rect.height,
1356
- top: rect.top,
1357
- left: rect.left,
1358
- bottom: rect.bottom,
1359
- right: rect.right
1360
- },
1361
- // Computed styles that affect visibility
1362
- computedStyles: {
1363
- display: computed.display,
1364
- visibility: computed.visibility,
1365
- opacity: computed.opacity,
1366
- position: computed.position,
1367
- overflow: computed.overflow,
1368
- zIndex: computed.zIndex,
1369
- backgroundColor: computed.backgroundColor,
1370
- transform: computed.transform
1371
- },
1372
- // Check if visible
1373
- isVisible: rect.width > 0 && rect.height > 0 && computed.display !== 'none' && computed.visibility !== 'hidden',
1374
- // Parent info
1375
- parentElement: this.container.parentElement ? {
1376
- tagName: this.container.parentElement.tagName,
1377
- className: this.container.parentElement.className,
1378
- offsetWidth: this.container.parentElement.offsetWidth,
1379
- offsetHeight: this.container.parentElement.offsetHeight
1380
- } : null
1381
- };
1382
- }
1383
-
1384
- /**
1385
- * Get comprehensive Cytoscape debug information
1386
- */
1387
- getCytoscapeDebugInfo() {
1388
- const extent = this.cy.extent();
1389
- const zoom = this.cy.zoom();
1390
- const pan = this.cy.pan();
1391
- const viewport = this.cy.viewport();
1392
-
1393
- return {
1394
- // Elements
1395
- nodeCount: this.cy.nodes().length,
1396
- edgeCount: this.cy.edges().length,
1397
- elementCount: this.cy.elements().length,
1398
- // Viewport
1399
- zoom: zoom,
1400
- pan: pan,
1401
- extent: extent,
1402
- viewport: viewport,
1403
- // Container
1404
- containerWidth: this.cy.width(),
1405
- containerHeight: this.cy.height(),
1406
- // Check if initialized
1407
- isInitialized: this.cy.scratch('_cytoscape-initialized') !== undefined,
1408
- // Renderer info
1409
- renderer: this.cy.renderer() ? {
1410
- name: this.cy.renderer().name,
1411
- options: this.cy.renderer().options
1412
- } : null
1413
- };
1414
- }
1415
-
1416
- /**
1417
- * Debug node positions to check if they're outside viewport
1418
- */
1419
- debugNodePositions() {
1420
- if (!this.cy || this.cy.nodes().length === 0) {
1421
- console.log('[HUD-BLANK-SCREEN-DEBUG] 4. No nodes to check positions');
1422
- return;
1423
- }
1424
-
1425
- console.log('[HUD-BLANK-SCREEN-DEBUG] 4. Node Positions:');
1426
- const nodes = this.cy.nodes();
1427
- const extent = this.cy.extent();
1428
- const viewport = this.cy.viewport();
1429
-
1430
- console.log('[HUD-BLANK-SCREEN-DEBUG] Viewport extent:', extent);
1431
- console.log('[HUD-BLANK-SCREEN-DEBUG] Current viewport:', viewport);
1432
-
1433
- nodes.forEach((node, index) => {
1434
- const position = node.position();
1435
- const data = node.data();
1436
- const boundingBox = node.boundingBox();
1437
-
1438
- console.log(`[HUD-BLANK-SCREEN-DEBUG] Node ${index + 1}:`, {
1439
- id: data.id,
1440
- label: data.label,
1441
- position: position,
1442
- boundingBox: boundingBox,
1443
- isVisible: node.visible(),
1444
- opacity: node.style('opacity'),
1445
- width: node.style('width'),
1446
- height: node.style('height')
1447
- });
1448
- });
1449
- }
1450
-
1451
- /**
1452
- * Add background color to container to verify it's visible
1453
- */
1454
- debugAddContainerBackground() {
1455
- if (this.container) {
1456
- this.container.style.backgroundColor = '#ff000020'; // Light red background
1457
- this.container.style.border = '2px solid #ff0000'; // Red border
1458
- this.container.style.minHeight = '400px'; // Ensure minimum height
1459
- console.log('[HUD-BLANK-SCREEN-DEBUG] Added red background and border to container for visibility test');
1460
- }
1461
- }
1462
-
1463
- /**
1464
- * Manual rendering triggers to force Cytoscape to render
1465
- */
1466
- debugManualRenderingTriggers() {
1467
- if (!this.cy) {
1468
- console.log('[HUD-BLANK-SCREEN-DEBUG] 5. No Cytoscape instance for manual rendering');
1469
- return;
1470
- }
1471
-
1472
- console.log('[HUD-BLANK-SCREEN-DEBUG] 5. Triggering manual rendering operations...');
1473
-
1474
- try {
1475
- // Force resize
1476
- console.log('[HUD-BLANK-SCREEN-DEBUG] - Forcing resize...');
1477
- this.cy.resize();
1478
-
1479
- // Force redraw
1480
- console.log('[HUD-BLANK-SCREEN-DEBUG] - Forcing redraw...');
1481
- this.cy.forceRender();
1482
-
1483
- // Force layout
1484
- if (this.cy.nodes().length > 0) {
1485
- console.log('[HUD-BLANK-SCREEN-DEBUG] - Running layout...');
1486
- this.cy.layout(this.layoutConfig).run();
1487
- }
1488
-
1489
- // Force viewport update
1490
- console.log('[HUD-BLANK-SCREEN-DEBUG] - Updating viewport...');
1491
- this.cy.viewport({
1492
- zoom: this.cy.zoom(),
1493
- pan: this.cy.pan()
1494
- });
1495
-
1496
- console.log('[HUD-BLANK-SCREEN-DEBUG] Manual rendering triggers completed');
1497
- } catch (error) {
1498
- console.error('[HUD-BLANK-SCREEN-DEBUG] Error during manual rendering:', error);
1499
- }
1500
- }
1501
-
1502
- /**
1503
- * Add test nodes to verify Cytoscape is working
1504
- */
1505
- debugAddTestNodes() {
1506
- if (!this.cy) return;
1507
-
1508
- console.log('[HUD-BLANK-SCREEN-DEBUG] Adding test nodes...');
1509
-
1510
- try {
1511
- // Clear existing elements
1512
- this.cy.elements().remove();
1513
-
1514
- // Add test nodes
1515
- const testNodes = [
1516
- {
1517
- group: 'nodes',
1518
- data: {
1519
- id: 'test-node-1',
1520
- label: '🤖 Test Node 1',
1521
- color: '#48bb78',
1522
- borderColor: '#38a169',
1523
- shape: 'rectangle',
1524
- width: 120,
1525
- height: 40
1526
- },
1527
- classes: 'pm-node'
1528
- },
1529
- {
1530
- group: 'nodes',
1531
- data: {
1532
- id: 'test-node-2',
1533
- label: '🔧 Test Node 2',
1534
- color: '#4299e1',
1535
- borderColor: '#3182ce',
1536
- shape: 'diamond',
1537
- width: 80,
1538
- height: 50
1539
- },
1540
- classes: 'tool-node'
1541
- },
1542
- {
1543
- group: 'nodes',
1544
- data: {
1545
- id: 'test-node-3',
1546
- label: '📝 Test Node 3',
1547
- color: '#e53e3e',
1548
- borderColor: '#c53030',
1549
- shape: 'triangle',
1550
- width: 70,
1551
- height: 40
1552
- },
1553
- classes: 'todo-node'
1554
- }
1555
- ];
1556
-
1557
- // Add test edges
1558
- const testEdges = [
1559
- {
1560
- group: 'edges',
1561
- data: {
1562
- id: 'test-edge-1',
1563
- source: 'test-node-1',
1564
- target: 'test-node-2'
1565
- }
1566
- },
1567
- {
1568
- group: 'edges',
1569
- data: {
1570
- id: 'test-edge-2',
1571
- source: 'test-node-2',
1572
- target: 'test-node-3'
1573
- }
1574
- }
1575
- ];
1576
-
1577
- // Add elements to Cytoscape
1578
- this.cy.add(testNodes);
1579
- this.cy.add(testEdges);
1580
-
1581
- console.log('[HUD-BLANK-SCREEN-DEBUG] Added 3 test nodes and 2 test edges');
1582
-
1583
- // Update our internal nodes map
1584
- testNodes.forEach(nodeElement => {
1585
- this.nodes.set(nodeElement.data.id, nodeElement.data);
1586
- });
1587
-
1588
- // Run layout
1589
- this.runLayout();
1590
-
1591
- } catch (error) {
1592
- console.error('[HUD-BLANK-SCREEN-DEBUG] Error adding test nodes:', error);
1593
- }
1594
- }
1595
-
1596
- /**
1597
- * Force zoom fit after layout with multiple attempts
1598
- */
1599
- debugForceZoomFit() {
1600
- if (!this.cy) return;
1601
-
1602
- console.log('[HUD-BLANK-SCREEN-DEBUG] 7. Forcing zoom fit...');
1603
-
1604
- const attemptZoomFit = (attemptNumber) => {
1605
- try {
1606
- console.log(`[HUD-BLANK-SCREEN-DEBUG] Zoom fit attempt ${attemptNumber}...`);
1607
-
1608
- // Get current state before fit
1609
- const beforeZoom = this.cy.zoom();
1610
- const beforePan = this.cy.pan();
1611
- const elements = this.cy.elements();
1612
-
1613
- console.log('[HUD-BLANK-SCREEN-DEBUG] Before fit:', {
1614
- zoom: beforeZoom,
1615
- pan: beforePan,
1616
- elementCount: elements.length
1617
- });
1618
-
1619
- if (elements.length > 0) {
1620
- // Try fit with specific options
1621
- this.cy.fit(elements, 50); // 50px padding
1622
-
1623
- // Get state after fit
1624
- const afterZoom = this.cy.zoom();
1625
- const afterPan = this.cy.pan();
1626
-
1627
- console.log('[HUD-BLANK-SCREEN-DEBUG] After fit:', {
1628
- zoom: afterZoom,
1629
- pan: afterPan,
1630
- changed: beforeZoom !== afterZoom || beforePan.x !== afterPan.x || beforePan.y !== afterPan.y
1631
- });
1632
-
1633
- // Force center
1634
- this.cy.center(elements);
1635
-
1636
- } else {
1637
- console.log('[HUD-BLANK-SCREEN-DEBUG] No elements to fit');
1638
- }
1639
-
1640
- } catch (error) {
1641
- console.error(`[HUD-BLANK-SCREEN-DEBUG] Zoom fit attempt ${attemptNumber} failed:`, error);
1642
- }
1643
- };
1644
-
1645
- // Multiple attempts with delays
1646
- attemptZoomFit(1);
1647
- setTimeout(() => attemptZoomFit(2), 100);
1648
- setTimeout(() => attemptZoomFit(3), 500);
1649
- setTimeout(() => attemptZoomFit(4), 1000);
1650
- }
1651
-
1652
- /**
1653
- * Quick test to draw a simple shape to verify Cytoscape canvas is working
1654
- */
1655
- debugDrawSimpleShape() {
1656
- if (!this.cy) {
1657
- console.log('[HUD-CANVAS-TEST] No Cytoscape instance');
1658
- return false;
1659
- }
1660
-
1661
- console.log('[HUD-CANVAS-TEST] Testing Cytoscape canvas rendering...');
1662
-
1663
- try {
1664
- // Clear everything
1665
- this.cy.elements().remove();
1666
-
1667
- // Add a single, simple node at center
1668
- this.cy.add({
1669
- group: 'nodes',
1670
- data: {
1671
- id: 'canvas-test',
1672
- label: '✅ CANVAS TEST',
1673
- color: '#ff0000',
1674
- borderColor: '#000000',
1675
- width: 200,
1676
- height: 100,
1677
- shape: 'rectangle'
1678
- },
1679
- position: { x: 200, y: 200 } // Fixed position
1680
- });
1681
-
1682
- // Force immediate render
1683
- this.cy.forceRender();
1684
-
1685
- // Zoom to fit this single node
1686
- this.cy.fit(this.cy.$('#canvas-test'), 50);
1687
-
1688
- console.log('[HUD-CANVAS-TEST] Canvas test node added and positioned');
1689
- console.log('[HUD-CANVAS-TEST] If you see a red rectangle with "CANVAS TEST", rendering works!');
1690
-
1691
- return true;
1692
-
1693
- } catch (error) {
1694
- console.error('[HUD-CANVAS-TEST] Canvas test failed:', error);
1695
- return false;
1696
- }
1697
- }
1698
-
1699
- /**
1700
- * Utility function to darken a color
1701
- * @param {string} color - Hex color
1702
- * @param {number} percent - Percentage to darken
1703
- * @returns {string} - Darkened hex color
1704
- */
1705
- darkenColor(color, percent) {
1706
- const num = parseInt(color.replace("#", ""), 16);
1707
- const amt = Math.round(2.55 * percent);
1708
- const R = (num >> 16) - amt;
1709
- const G = (num >> 8 & 0x00FF) - amt;
1710
- const B = (num & 0x0000FF) - amt;
1711
- return "#" + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 +
1712
- (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 +
1713
- (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);
1714
- }
1715
- }
1716
-
1717
- // Export for use in dashboard
1718
- window.HUDVisualizer = HUDVisualizer;